【问题标题】:promise returns undefined while calling from two different mysql queries从两个不同的 mysql 查询调用时,promise 返回 undefined
【发布时间】:2017-11-18 17:44:06
【问题描述】:

我有两个运行承诺的 mysql 查询。

第一个是更新 mysql 表上的信息,然后解决问题并调用下一个 mysql 查询。问题是,当它调用下一个 mysql 查询时,promise 返回 UNDEFINED,我不知道为什么。当我在我的节点 js 服务器发布请求中 console.log 它时,它给出了未定义的。我在代码中记录了哪些区域存在问题。

UpdateUserPath = (data) => new Promise((resolve,reject)=>{
    data.UPDATE_DT = getDateTime();
    db.query('UPDATE path  UPDATE_DT = ?  where Owner = ?',
        [data.UPDATE_DT, data.Owner], function(err,results,fields){
        if(err){
            reject('Could not update user path');
        }else{
            if(results.affectedRows > 0){
                data.ID = null;
                data.UPDATE_DT = null;
                // The problem is here, when this gets resolved it calls the other function SaveUserPath
                resolve(saveUserPath(data));
            }else{
                reject('Could not update user path');
            }
        }
    });
});


saveUserPath = (data) => new Promise((resolve, reject) => {
    db.query('INSERT INTO path SET ?', data, function (error, results, fields) {
        if (error) {
            reject('Could not insert path');
        }else{
            var Id = results.insertId;

            db.query('UPDATE path SET ORIG_ID = ? where ID = ?',[Id, Id], function(err,results,fields){
                if(err){
                    reject('Could not insert row to path  table - saveuserpath');
                }else{
                    if(results.affectedRows > 0){
                       // THIS INFORMATION HERE IS UNDEFINED
                        return resolve(results[0]);
                    }else{
                        reject('Could not update path');
                    }
                }
            });
        }
    });
});

在服务器中它被这样调用。

getUserPath(req.session.userid).then((path_data)=>{
                path_data.status = 1;
                UpdateUserPath(path_data).then((result)=>{
                    console.log(result); // THIS IS UNDEFINED
                });
            });

我想知道resolve(saveUserPath(data)); 是否是调用不在服务器外部的另一个承诺的正确方法。 我正考虑这样做。

UpdateUserPath(path_data).then((result)=>{
   saveUserPath(result).then((result_save) => {
     console.log(result_save); // THIS MIGHT WORK 
   });
});

但是为什么正常的方式是错误的。

【问题讨论】:

  • saveUserPath() 中,第二个查询的console.log(results) 显示什么?
  • 这是一个类示例,说明您应该如何直接为数据库使用 Promisified 接口,而不是尝试在手动创建的 Promise 中包装多个嵌套回调。这段代码比它需要的更容易出错和冗长。
  • @jfriend00 正常工作。
  • @jfriend00 任何修复建议,我不太清楚你的意思。
  • // THIS INFORMATION HERE IS UNDEFINED - 所以,如果你 console.log(results[0]) 在那一行,你会得到 undefined ?

标签: mysql node.js promise


【解决方案1】:

我有几个猜测为什么它不起作用,但是有很多错误的地方,所以最好只是清理代码以更好地设计。

当在一个基于 Promise 的接口中组合多个异步回调驱动的操作时,您确实希望在底层函数的最低级别上 Promisify,然后您可以利用 Promise 的优势实现所有控制流和错误处理。我认为这也将使您的问题消失,并可能修复其他几个错误。

// promisify db.query()
// if a promisified interface is built into your database, use that one instead
db.queryP = function(q, d) {
    return new Promise((resolve, reject) {
        db.query(q, d, (err, results, fields) => {
            if (err) {
                reject(err);
            } else {
                resolve(results);
            }
        });
    });
}

UpdateUserPath = function(data) {
    data.UPDATE_DT = getDateTime();
    let q = 'UPDATE path  UPDATE_DT = ?  where Owner = ?';
    return db.queryP(q, [data.UPDATE_DT, data.Owner]).then(results => {
        if (results.affectedRows > 0) {
            data.ID = null;
            data.UPDATE_DT = null;
            return saveUserPath(data);
        } else {
            throw new Error('Could not update user path');
        }
    });
}

saveUserPath = function(data) {
    let q = 'INSERT INTO path SET ?'
    return db.queryP(q, data).then(results => {
        let q2 = 'UPDATE path SET ORIG_ID = ? where ID = ?';
        var Id = results.insertId;
        return db.queryP(q2, [Id, Id]).then(results2 => {
            if (results2.affectedRows > 0) {
                return results2[0];
            } else {
                throw new Error('Could not update path');
            }
        });
    });
}

getUserPath(req.session.userid).then(path_data => {
    path_data.status = 1;
    return UpdateUserPath(path_data);
}).then(result => {
    // process result here
}).catch(err => {
    // process error here
});

【讨论】:

  • 我对解决部分也有同样的想法。但是,是的,重写可能是一个更好的主意,我可以请我把这个问题保持开放一段时间,看看人们可能会想出什么,如果没有别的,我会重写它并给你奖励 :D 谢谢不过帮忙!
  • @FarhanaFayez - 当然,在接受一个作为最佳答案之前,您可以等待其他答案,但如果这有帮助,您可以随时为所有有用的答案投票。
  • @Roamer-1888 - 如果您在 OP 的代码中讨论,那将不起作用。它在一个 Promise 执行器函数和一个异步回调中,所以返回一个 Promise 不会在那里做任何事情。如果你在我的代码中谈论,那我已经在做。
  • @jfriend00,这是对您脚注的评论。你做过测试吗?
  • 对不起,我的意思是resolve(saveUserPath(data)); 应该很酷。
猜你喜欢
  • 2018-04-18
  • 2018-04-07
  • 2021-06-11
  • 2021-09-16
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多