我有一个 Node.js (express.js) 服务器,我在其中提供一个简单的 auth-api。
在我的一条 route ,我在返回“资源”之前更改了很多子步骤。
我使用 bluebird 来实现 promise 。
router.post('/register', function(req, res, next) {
// ------- 1. check if already existing
var p = store.checkIfExisting(req, res) //-->mongoose .find(). Returns promise
.then(function(isExisting) {
if (isExisting) {
console.log("try to cancel");
p.cancel();
}
// ------- 2. Facebook validation
return validateFacebookSignedRequest(req.body.fbsrCookie); //True/False
})
.then(function(fbIsValid) {
// ------- 3. create Users
return store.saveUser(req, res); // --> mongoose.save(). Returns promise
})
.then(function(user) {
// ------- 4. Token generieren
return store.generateTokenForFbUID(req, res);
}).then(function(token) {
// ------- 5. send back the token
res.send({
success: true,
message: token
});
})
.cancellable()
.catch(function(err) {
console.log("canceled");
});
});
所以我想知道...
当检测到某些错误时我如何中断链条 子步骤(现在我使用
p.cancel();
)在链的某些
then
中,我返回具体值(如 token ),在其他一些情况下,我返回 promise 。看起来 Bluebird 可以处理这两种情况并且不会中断链条(这实际上让我感到困惑,因为我返回的数字没有then
-method
最佳答案
我建议不要使用cancellable
。这很少是您想要的,在这种情况下当然也不是。您应该抛出一个错误:
var p = store.checkIfExisting(req, res)
.then(function(isExisting) {
if (isExisting) {
throw new NotFoundError(); // Some custom error type
}
return validateFacebookSignedRequest(req.body.fbsrCookie);
})
// ...more steps...
.then(function(token) {
res.send({
success: true,
message: token
});
})
.catch(NotFoundError, function(err) {
// whatever you do when its not found
});
然后您可以捕获其他错误类型(如果有)。
对于你的第二个问题,then
、catch
等总是返回 promise 。您向它们传递一个回调,然后它们对该回调返回的内容进行操作。如果返回一个 Promise,则一旦 Promise 完成,它就会使用该 Promise 的返回值进行解析,否则它会立即使用回调返回的任何内容进行解析。
您可以看出情况一定如此,因为当 then
返回时,它还不知道您传递给它的回调的返回值。所以它必须总是返回相同的东西;在这种情况下,是一个 promise 。
关于Node.js:如何以正确的方式处理 promise 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32077306/