Как использовать Model.query() с promises в SailsJS/Waterline?
У меня проблемы с Sails.JS 0.9.8.
Я хотел бы использовать promises с функцией Model.query() (я использую адаптер sails-mysql).
Этот код будет работать:
User.findOne({ email: email })
.then(function(user) {
console.log(user);
});
но этот не будет
User.query("SELECT email FROM user WHERE email = ?", [ email ]))
.then(function(err, rows) {
console.log(rows);
})
Я получаю undefined для "err" и "rows".
Это просто не реализовано, или я делаю что-то неправильно?
Если не реализовано, есть ли альтернатива использованию promises с .query()?
Заранее благодарю
Ответы
Ответ 1
Вы можете promisify(User.query)
самостоятельно, как и для любого другого API на основе обратного вызова, например:
var Promise = require('bluebird');
....
var userQueryAsync = Promise.promisify(User.query);
userQueryAsync("SELECT email FROM user WHERE email = ?", [ email ])
.then(function(user) {
console.log(user);
});
Ответ 2
В качестве взлома вы можете обезвреживать все ваши модели в бутстрапе, как это
module.exports.bootstrap = function(cb) {
var Promise = require('bluebird');
Object.keys(sails.models).forEach(function (key) {
if (sails.models[key].query) {
sails.models[key].query = Promise.promisify(sails.models[key].query);
}
});
cb();
};
Ответ 3
Метод query
специфичен для sails-mysql и не поддерживает отложенные объекты так, как это делают более общие методы адаптера Waterline (например, findOne
, find
, create
и т.д.). В качестве второго аргумента вам нужно будет указать обратный вызов.
Ответ 4
Если вы не хотите использовать promisify, но хотите, чтобы SailsModel.query
верните обещание.
/**
* @param {Model} model - an instance of a sails model
* @param {string} sql - a sql string
* @param {*[]} values - used to interpolate the string ?
*
* @returns {Promise} which resolves to the succesfully queried strings
*/
function query(model, sql, values) {
values = values || [];
return new Promise((resolve, reject) => {
model.query(sql, values, (err, results) => {
if (err) {
return reject(err);
}
resolve(results);
});
});
}
// and use it like this
query(User, 'SELECT * FROM user WHERE id = ?', [1]).then(console.log);