如何在SailsJS / Waterline中使用Model.query()和promise?

我遇到了Sails.JS 0.9.8的问题。 我想使用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); }) 

我得到了'err'和'rows'的undefined。

它只是没有实施,或者我做错了什么? 如果没有实现,是否有任何替代使用.query()承诺?

先谢谢你

你可以自己promisify(User.query) ,就像你要做的任何其他基于callback的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); }); 

作为一个黑客,你可以在这样的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(); }; 

query方法特定于sails-mysql,不支持延迟对象的方式,更普遍的Waterline适配器方法(例如findOnefindcreate等)。 你将不得不提供一个callback作为第二个参数。

如果您不想使用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);