【问题标题】:How to use Model.query() with promises in SailsJS/Waterline?如何在 SailsJS/Waterline 中使用 Model.query() 和 Promise?
【发布时间】:2014-03-20 03:30:21
【问题描述】:

我遇到了 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() 一起使用?

提前谢谢你

【问题讨论】:

    标签: javascript node.js promise sails.js waterline


    【解决方案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);
    });
    

    【讨论】:

    • 非常好——我们现在从sails文档中.query()的参考页面链接到这里。
    • 我只得到 node_modules/sails-mysql/node_modules/mysql/lib/protocol/Parser.js:77 throw err; // 重新抛出非 MySQL 错误 ^ RangeError: Offset is out of bounds
    【解决方案2】:

    作为 hack,您可以像这样在 bootstrap 中对所有模型进行猴子补丁

    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 适配器方法(例如findOnefindcreate 等)那样支持延迟对象。您必须提供回调作为第二个参数。

      【讨论】:

        【解决方案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'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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-30
          • 1970-01-01
          • 2015-08-25
          • 1970-01-01
          • 2019-09-01
          相关资源
          最近更新 更多