2017-06-29 84 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

相关问题