0

我试图打破基于表达式的函数,但是在范围界定方面遇到了麻烦。这是代码片段:

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,代码将不会到达“插入文档”部分。请让我知道这样做的正确方法(也许使用异常?这是我剩下的唯一想法)。谢谢

4

1 回答 1

1

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

问题 2 也很常见。returninexec()不返回可以分配给变量的值。(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");
            }
        });
    });
}

我也改为findfindOne否则你会得到一个数组而不是一个文档。

于 2012-08-06T22:54:21.393 回答