【问题标题】:Return data from database.query() using sailsjs使用sailsjs从database.query()返回数据
【发布时间】:2015-08-06 03:47:18
【问题描述】:

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

在/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];
    });

我认为问题出在回调上,但我不确定如何从查询中检索数据。我已经搜索了答案,但似乎找不到与我的问题匹配的正确搜索词。任何帮助将不胜感激在此先感谢。

【问题讨论】:

    标签: mysql database api sails.js waterline


    【解决方案1】:

    确实,您的问题与回调和异步代码有关。 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

    【讨论】:

    • 感谢帮助,我正在使用 Promise 进行异步!
    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 2013-03-20
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2015-06-04
    • 2016-08-15
    • 2015-05-04
    相关资源
    最近更新 更多