我试图打破基于表达式的函数,但是我遇到了范围问题。以下是代码片段:
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,代码将无法到达“插入文档”部分。请让我知道这样做的正确方法(也许使用例外?这是我唯一的想法剩下)。感谢
答案 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
,否则您将获得一个数组而不是一个文档。