我正在尝试习惯使用 Promises。
但是,我正在努力在子函数中抛出错误以冒泡到主函数。
我将 Senecajs 用于我的所有模块,如下所示:
// resend-invite.js
module.exports = function(options) {
const Promise = require('bluebird'),
seneca = this,
act = Promise.promisify(seneca.act, {context: seneca});
this.add({role:'project-actions', cmd: 'resend-invite'}, function( msg, done ) {
return findProject()
.then(function(project) {
if ( !project.userHasAdminAccess( msg.user_id ) ) {
throw Error( 'User does not have admin access.' );
}
// makes it here...
return act( { role: "user-repository", cmd: "get-referral-user", user: { email: msg.email } } );
})
.then(function(referral_user) {
// doesn't make it here :(
var referral_name = referral_user.first_name + " " + referral_user.last_name;
return anotherFunction();
})
.then(function(mail_info) {
done(null, mail_info);
})
.catch(function(err) {
// doesn't make it here :(
done(err);
})
});
}
像这样:
// get-referral-user.js
module.exports = function(options) {
const Promise = require('bluebird'),
seneca = this,
User = require('app/models/user');
this.add({role:'user-repository', cmd: 'get-referral-user'}, function( msg, done ) {
return User.findOne(msg.user).exec()
.then(function(user) {
var referral_user_id;
if (user == null) {
throw Error("User wasn't found.");
}
referral_user_id = user.referral_user_id;
return User.findById(referral_user_id).exec()
})
.then(function(user) {
done(null, user.toObject());
})
.catch(function(err) {
// gets to this err handler
done(err);
})
});
}
但是,当 get-referral-user.js 中出现错误时,它会被 get-referral-user.js .catch 块捕获,但错误不会被 thr resend-invite.js catch 块捕获。
如何获取 resend-invite.js 代码来检测子功能(act({ role: "user-repository", cmd: "get-referral-user", user: { email: msg.email } } ) 在这种情况下) 有错误,需要处理。
以下是在我的控制台中产生的可能有用的错误部分:
Seneca Fatal Error
Message: seneca: Action cmd:get-referral-user,role:user-repository failed: User wasn't found..
..
ALL ERRORS FATAL: action called with argument fatal$:true (probably a plugin init error, or using a plugin seneca instance)
任何帮助是极大的赞赏。谢谢你。