exec回调范围

时间:2012-08-06 22:41:46

标签: node.js express mongoose

我试图打破基于表达式的函数,但是我遇到了范围问题。以下是代码片段:

function createService(dict, res) {
    // Ensure no duplicate
    var serviceExists = Service.find({name: dict['name']}).count().exec(function(err, doc) {
        return (doc !== 0);
    });

    console.log(serviceExists);

    if(serviceExists){
        res.send(500, "Duplicate document. Try updating existing entry or chooseing a different name");
        return;
    }

    //Insert the document
    service = new Service(dict);
    service.save(function(err) {
        if(!err) {
            res.send("Service saved");
        }
    });
}

console.log()的输出:

{ emitted: {},
  _events: { err: [Function], complete: [Function] } }

这里的最终目标是,如果doc!== 0,代码将无法到达“插入文档”部分。请让我知道这样做的正确方法(也许使用例外?这是我唯一的想法剩下)。感谢

1 个答案:

答案 0 :(得分:1)

Service.find是异步的。 exec中的回调不会立即执行。这会导致问题1.(如果Service....exec(...)返回了一个值,那么在回调之前您的console.log就已经执行了。)

问题2也很常见。 return中的exec()不会返回您可以分配给变量的值。 (exec()不返回匿名函数的返回值。)

以下是对您的代码的修复:

function createService(dict, res) {
    // Ensure no duplicate
    Service.findOne({name: dict['name']}).count().exec(function(err, doc) {
        var serviceExists = (doc !== 0);
        console.log(serviceExists);
        if(serviceExists){
            res.send(500, "Duplicate document. Try updating existing entry or chooseing a different name");
            return;
        }

        //Insert the document
        service = new Service(dict);
        service.save(function(err) {
            if(!err) {
                res.send("Service saved");
            }
        });
    });
}

我还将find更改为findOne,否则您将获得一个数组而不是一个文档。