【问题标题】:perform async multiple Mysql queries on Node在 Node 上执行异步多个 Mysql 查询
【发布时间】:2016-12-01 15:33:51
【问题描述】:

我在 Mysql 中使用节点,这是我的问题。

我正在尝试在我的数据库中添加新照片并将其作为数组返回

这是我的功能:

function addNewPhotos(_id, files) {
var deferred = Q.defer();
var new_photos = []
_.each(files, function (one) {
    var data = [
        one.path,
        _id,
        0
    ]
    var sql = 'INSERT INTO photos(photo_link, id_user, isProfil) VALUES (?, ?, ?)';
    db.connection.query(sql, data, function (err, result) {

        if (err)
            deferred.reject(err.name + ': ' + err.message);
        var sql = 'SELECT id_user, photo_link, isProfil FROM `photos` WHERE id = ?';
        if (result){
            db.connection.query(sql, [result.insertId], function(err, photo) {
                if (err) deferred.reject(err.name + ': ' + err.message);
                if (photo) {
                    new_photos.push(photo[0]);
                }
            });
        }
    })
})
deferred.resolve(Array.prototype.slice.call(new_photos));
return deferred.promise}

插入效果很好,但我无法检索结果以将它们发送回客户端。 (我的数组是空的)

谢谢。

【问题讨论】:

  • db.connection.query 是异步的,所以它的回调之外的任何事情都会在回调被调用之前发生。

标签: mysql node.js underscore.js q deferred


【解决方案1】:

总是在最低级别承诺,在这种情况下db.connection.query()

if(!db.connection.queryAsync) {
    db.connection.queryAsync = function(sql, data) {
        return Q.Promise(function(resolve, reject) { // or possibly Q.promise (with lower case p), depending on version
            db.connection.query(sql, data, function(err, result) {
                if(err) {
                    reject(err);
                } else {
                    resolve(result);
                }
            });
        });
    };
}

现在高级代码变得非常简单:

function addNewPhotos(_id, files) {
    var sql_1 = 'INSERT INTO photos(photo_link, id_user, isProfil) VALUES (?, ?, ?)',
        sql_2 = 'SELECT id_user, photo_link, isProfil FROM `photos` WHERE id = ?';
    return Q.all(files.map(function(one) {
        return db.connection.queryAsync(sql_1, [one.path, _id, 0]).then(function(result) {
            return db.connection.queryAsync(sql_2, [result.insertId]);
        });
    }));
};

为了防止单个故障破坏整个事情,您可以选择捕获单个错误并注入某种默认值;

function addNewPhotos(_id, files) {
    var sql_1 = 'INSERT INTO photos(photo_link, id_user, isProfil) VALUES (?, ?, ?)',
        sql_2 = 'SELECT id_user, photo_link, isProfil FROM `photos` WHERE id = ?',
        defaultPhoto = /* whatever you want as a default string/object in case of error */;
    return Q.all(files.map(function(one) {
        return db.connection.queryAsync(sql_1, [one.path, _id, 0]).then(function(result) {
            return db.connection.queryAsync(sql_2, [result.insertId]);
        }).catch(function() {
            return defaultPhoto;
        });
    }));
};

【讨论】:

  • 谢谢,我是异步调用的新手,我对这个过程的看法不同!
  • 添加了一些错误恢复,您可能会觉得有用。
【解决方案2】:

一切都完成后,在你的异步循环函数中返回

function addNewPhotos(_id, files) {
var deferred = Q.defer();
var new_photos = [];

var todo = files.length;
var done = 0;
_.each(files, function (one) {
    var data = [
        one.path,
        _id,
        0
    ]
    var sql = 'INSERT INTO photos(photo_link, id_user, isProfil) VALUES (?, ?, ?)';
   db.connection.query(sql, data, function (err, result) {

       if (err)
            deferred.reject(err.name + ': ' + err.message);
       var sql = 'SELECT id_user, photo_link, isProfil FROM `photos` WHERE id = ?';
        if (result){
            db.connection.query(sql, [result.insertId], function(err, photo) {
                if (err) deferred.reject(err.name + ': ' + err.message);
                if (photo) {
                    new_photos.push(photo[0]);
                }
                if(++done >= todo){
                   deferred.resolve(Array.prototype.slice.call(new_photos));
                   return deferred.promise
                }
            });
        }
        else
        {
           if(++done >= todo){
              deferred.resolve(Array.prototype.slice.call(new_photos));
              return deferred.promise;
           }
        }
    })
  })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2014-08-05
    • 2018-04-04
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多