如何在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适配器方法(例如findOne
, find
, create
等)。 你将不得不提供一个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);