11

我遇到了 Sails.JS 0.9.8 的问题。我想在 Model.query() 函数中使用 Promise(我使用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'都没有定义。

它只是没有实施还是我做错了什么?如果未实现,是否有任何替代方法可以将 promise 与 .query() 一起使用?

先感谢您

4

4 回答 4

25

您可以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);
});
于 2014-11-06T00:23:25.797 回答
4

作为一个黑客,你可以像这样在引导程序中对所有模型进行猴子补丁

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();
};
于 2015-12-07T18:37:39.300 回答
3

query方法特定于sails-mysql,并且不像更通用的Waterline 适配器方法(例如,、、等)那样支持findOne延迟find对象create。您必须提供回调作为第二个参数。

于 2014-02-19T20:28:09.340 回答
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);
于 2016-10-07T11:41:48.187 回答