我遇到使用来自Mongoose
这是我的代码
req.checkBody(BookManager.SCHEME);
req.getValidationResult()
.then(function (result) {
if (!result.isEmpty()) {
handler.onError('Invalid payload');
return;
}
return new BookModel({
author: data.author,
name: data.name,
year: data.year
});
})
.then((book) => {
BookModel.find({name: book.name}, function (err, docs) {
if (docs.length) {
throw new Error("Book already exists");
} else {
return book;
}
});
})
.then((book) => {
book.save();
})
.then((saved) => {
handler.onSuccess(saved);
})
.catch((error) => {
handler.onError(error.message);
});
从上面的代码中可以看出。我正在检查这样的书是否已经存在,为了做到这一点,我使用了在主程序计数器"之后调用的异步查找方法。已经走得更远了。
我该如何解决这个问题?
还请告诉我,我是否选择了正确的等待来实现我的用例?也许我做错了,还有一些其他最好的做法可以解决这个问题。
答案 0 :(得分:1)
您不得将回调传递给BookModel.find()
以取回承诺。此外,您不能忘记return
来自then
回调的承诺继续链接:
req.getValidationResult().then(result => {
if (!result.isEmpty()) {
throw 'Invalid payload';
}
return new BookModel({
author: data.author,
name: data.name,
year: data.year
});
}).then(book =>
BookModel.find({name: book.name}).then(docs =>
book
, err => {
throw new Error("Book already exists");
})
).then(book =>
book.save()
).then(handler.onSuccess, handler.onError);
答案 1 :(得分:0)
我相信你的第二个then(..)
应该更像这样:
.then(function(book){
return new Promise(function(resolve, reject){
BookModel.find({ name: book.name }, function(err, docs) {
if (docs.length) {
reject({message: "Book already exists"});
} else {
resolve(book);
}
});
});
})