2017-06-29 60 views
1

我是新來的節點和承諾。我有兩個文件 - server.jsdb.js將對象從SQL查詢函數傳遞到一個單獨的函數

server.js作爲模塊導入db.js

我正在從db.js模塊中的SQL數據庫提取一些數據,並試圖將該數據傳遞給server.js中的函數。 我已經成功從數據庫中提取數據,但是當我嘗試將它傳遞給server.js中的函數時,它僅返回undefined值。

下面的代碼

server.js

const db = require('./db.js'); 

app.post('/api/trigger-push-msg/', function (req, res) { 
    return getSubscriptionsFromDatabase() 
    .then(function(subscriptions) { 

    // Do something 

    }); 
}); 

function getSubscriptionsFromDatabase() { 
    return new Promise((resolve, reject) => { 
    let subscriptions = db.getSubscriptions(); 

    console.log(subscriptions); // this only prints "undefined" 

    if (subscriptions != undefined) { 
     resolve(subscriptions); 
    } else { 
     reject("No"); // this executes 
    } 
    }) 
} 

db.js

module.exports = { 
    getSubscriptions: function() { 
    var sql = "SELECT * FROM subscriptions"; 

    con.query(sql, function(err, result) { 
     if (err) throw err; 
     console.log(result); // this prints the same result as I want 
     return result; 
    }) 
    } 
} 
+0

你應該把'返回新希望(...)'的'getSubscriptions'功能。你不能從該回調中返回,你只能調用'resolve'。 – Bergi

回答

1

getSubscriptions沒有return語句

並且考慮到其中包含一些異步內容,您應該將所有內容都包裝在promise中,並且只有在解析後才觸發後續邏輯。

module.exports = { 
    getSubscriptions: function() { 
    var sql = "SELECT * FROM subscriptions"; 
    return new Promise(function(resolve, reject){ 
     con.query(sql, function(err, result) { 
     if (err) return reject(err); 
     resolve(result); 
     }) 
    }) 
    } 
} 

則:

function getSubscriptionsFromDatabase() { 
    return db.getSubscriptions() 
    .then(function(subscriptions){ 
    return subscriptions; 
    }) 
} 

,並在您的路線:

app.post('/api/trigger-push-msg/', function (req, res) { 
getSubscriptionsFromDatabase() 
    .then(function(subscriptions) { 
    res.send(subscriptions); 
    }) 
    .catch(function(err){ 
    res.sendStatus(500); 
    }) 
}); 
+0

我在'resolve(subscriptions);'之前添加了一個控制檯日誌語句,但它根本沒有得到執行。 –

+0

我已經修復了代碼,請檢查它現在是否有效:) – Karim

相關問題