MySQL的Javascript承诺

MySQL的Javascript承诺,javascript,mysql,node.js,Javascript,Mysql,Node.js,我正在实现一个API来管理来自Nodejs的MySQL数据库,我希望保持我的代码干净,因为我要做的工作可能需要大量嵌套的connection.query函数,所以我决定将尽可能多的查询分离为单独的函数 首先,我想做一个函数来检查表中是否已经存在一个元素,如下所示: function validator(item) { return new Promise(function(err,done) { connection.query('select * from items wher

我正在实现一个API来管理来自Nodejs的MySQL数据库,我希望保持我的代码干净,因为我要做的工作可能需要大量嵌套的connection.query函数,所以我决定将尽可能多的查询分离为单独的函数

首先,我想做一个函数来检查表中是否已经存在一个元素,如下所示:

function validator(item) {
    return new Promise(function(err,done) {
    connection.query('select * from items where item_id = ?', [item.id] , function(err,rows){
        console.log(rows);
        console.log("above row object");
        if (err) {
            return done(false);
        }
        if (rows.length) {
            console.log('That item is already in the DB.');
            return done(false);
        } else {
            console.log('That item is new.');
           return done(true);
        } 
    });
});
}
    var insert = function (item, done) {
    validator(item).then(function(err,done) {
        console.log('here I go: '+done);
        if(done) {
            console.log('good');
        } else{
            console.log('bad')
        }
      );
    }
validator(item).then(function(done) {
然后我想这样使用它:

function validator(item) {
    return new Promise(function(err,done) {
    connection.query('select * from items where item_id = ?', [item.id] , function(err,rows){
        console.log(rows);
        console.log("above row object");
        if (err) {
            return done(false);
        }
        if (rows.length) {
            console.log('That item is already in the DB.');
            return done(false);
        } else {
            console.log('That item is new.');
           return done(true);
        } 
    });
});
}
    var insert = function (item, done) {
    validator(item).then(function(err,done) {
        console.log('here I go: '+done);
        if(done) {
            console.log('good');
        } else{
            console.log('bad')
        }
      );
    }
validator(item).then(function(done) {
但是它并没有像我预期的那样工作,第一个函数准确地检测项目是否存在,但是第二个函数永远不会到达我现在打印的页面


我已经检查过了,但我得出的结论是,这是一个典型的PEBCAK问题,比如我是一个非常不称职的javascript程序员,不能将我的头脑集中在回调和承诺上,所以我用错误的方式管理它们。

您传递给的第一个回调不是失败的

改变

return new Promise(function(err,done) {
进入

这样称呼它:

function validator(item) {
    return new Promise(function(err,done) {
    connection.query('select * from items where item_id = ?', [item.id] , function(err,rows){
        console.log(rows);
        console.log("above row object");
        if (err) {
            return done(false);
        }
        if (rows.length) {
            console.log('That item is already in the DB.');
            return done(false);
        } else {
            console.log('That item is new.');
           return done(true);
        } 
    });
});
}
    var insert = function (item, done) {
    validator(item).then(function(err,done) {
        console.log('here I go: '+done);
        if(done) {
            console.log('good');
        } else{
            console.log('bad')
        }
      );
    }
validator(item).then(function(done) {
顺便说一句,对解析回调和结果都调用done是非常混乱的

处理传入错误:更改

if (err) {
        return done(false);
}
进入

别忘了抓住那些错误


此外,它可能不在本QA的范围内,但您通常会获取和释放连接。您可能应该看看PromiseReady mysql驱动程序。

返回新PromiseFunctioner,完成{?这不是承诺的工作方式。这似乎对我有帮助,但现在我的打印控制台。log'here I go:'+done;总是告诉我这里我去了未定义的,当一个项目不存在时,回调返回的'done'不应该是'true'吗?也是的,我知道我需要释放连接,这只是一个概念的小测试。@DanielOrtiz我编辑到p请指出一些其他问题。我建议将其重命名为done。非常感谢,您的指针帮助我解决了这个问题,事实上,最后一部分是我在使用validatoritem时感到疲劳的结果。thenfunctionerr,done{而不是validatoritem。thenfunctiondone,err{因此,未定义“done”。