我遇到了Sails.JS 0.9.8的问题。 我想在Model.query()函数中使用promises(我使用sails-mysql adapter)。
此代码可以使用:
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);
})
我对“错误”和“行”都没有定义。
它刚刚没有实施,或者我做错了什么? 如果没有实现,有没有替代使用.query()的承诺?
提前谢谢
答案 0 :(得分:24)
您可以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);
});
答案 1 :(得分:4)
作为一个黑客,你可以像这样使用bootstrap中的所有模型进行monkeypatch
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();
};
答案 2 :(得分:3)
query
方法特定于sails-mysql,并且不支持延迟对象,就像更通用的Waterline适配器方法(例如findOne
,find
,{{1等等)。你必须提供一个回调作为第二个参数。
答案 3 :(得分:2)
如果您不想使用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's ?
*
* @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);