2015-08-06 3 views
1

Я пытаюсь создать api с помощью sailsjs, который вызывает хранимые процедуры базы данных MYSQL. Я решил отделить запрос, добавив его в службу, чтобы другие функции могли их вызывать и использовать. Ниже я придумал.Возвращает данные из database.query() с помощью sailsjs

в/API/контроллер/MySqlController

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

в/API/услуги/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; 

Когда я попал в апи данные отображаются точно, как я думал, что это будет. Но проблема в том, что когда я пытаюсь вызвать службу spGetAllUsers и назначать переменную, я получаю неопределенное значение.

Как это:

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

Я считаю, что проблема с обратными вызовами, но я не уверен, как получить данные из запроса. Я искал ответ, но я не могу найти правильные условия поиска, соответствующие моей проблеме. Любая помощь будет принята с благодарностью. Спасибо заранее.

ответ

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.

+0

Спасибо, это помогло, я использую обещания для async! – user990951

Смежные вопросы