使用sailsjs从database.query()返回数据

时间:2015-08-06 03:47:18

标签: mysql database api sails.js waterline

我正在尝试使用调用MYSQL数据库的存储过程的sailsjs来构建api。我决定通过将查询添加到服务来解除查询,以便其他函数可以调用它们并使用它们。以下是我提出的建议。

在/ api / controller / MySqlController下

getAllUsers: function (req, res) {
    MySqlSpService.spGetAllUsers(function(err, result){
        if(err) return res.serverError(err);
        return res.ok(result[1]);
    });
}, 

在/ api / services / MYSQLService下

 var MySqlSpService= {

     spGetAllUsers: function(callback) {
       Database.query('call userDb.sp_get_all_users(@message, @mystatus)', function (err, results) {
        callback(err, results);
    }); // end query

}
 module.exports = MySqlSpService;

当我点击api时,数据显示我的想象。但问题是,当我尝试调用spGetAllUsers服务并分配给变量时,我得到一个未定义的值。

像这样:

  var users = MySqlSpService.spGetAllUsers(function(err, result){
        if(err) return res.serverError(err);
        return result[1];
    });

我认为问题在于回调,但我不确定如何从查询中检索数据。我已经搜索了答案,但我似乎无法找到符合我问题的正确搜索字词。任何帮助将不胜感激提前感谢。

1 个答案:

答案 0 :(得分:2)

确实,你的问题是关于回调和异步代码。 MySqlSpService.spGetAllUsers()函数不返回任何内容,此方法中没有return语句。但它执行一个回调函数,您可以在其中执行依赖于SQL查询结果的代码。

您必须像这样编写代码,因为数据库查询是异步执行的。

console.log('This is executed first');

MySqlSpService.spGetAllUsers(function(err, result){
    console.log('This is executed when the result of the database query is received');
    if(err) return res.serverError(err);
    users = result[1];
    /**
     * Here you can access to the "users" data
     * and execute code depending on it
     */
});

console.log('This is executed in second and it is not possible to know the result of the query yet');

async这样的工具可以帮助您组织异步代码。默认情况下,async is available globally in sails.js