Node.js:如何以正确的方式处理promise

我有一个Node.js(express.js) – 服务器,我提供了一个简单的authenticationapi。

在我的一条路线中,我在返回“资源”之前改变了很多子步骤。

我使用蓝鸟的承诺。

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"); }); }); 

所以我想知道…

  1. 当在子步骤中检测到一些错误时(我们现在使用p.cancel();p.cancel();

  2. 在这个链的某些部分,Im返回conrete的值(如token),在其他一些情况下返回的promise。 似乎蓝鸟可以处理这两个,并不会中断链(实际上,因为我回来了一个没有的方法, then – 方法

我会build议不要使用cancellable 。 这很less是你想要的,当然不是在这种情况下。 你应该抛出一个错误:

  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 }); 

那么你可以捕获其他的错误types,如果有的话。

对于你的第二个问题, thencatch等等总是回报承诺。 你传给他们一个callback函数,他们根据callback函数返回的结果。 如果一个promise被返回,那么一旦promise已经完成,它就会用这个promise的返回值来parsing,否则它将立即用返回的callback来解决。

你可以告诉这是肯定的,因为当它返回时,它还不知道你通过它的callback函数的返回值。 所以它必须总是返回相同的东西; 在这种情况下,承诺。