我正在使用护照js构建快递js api,并且为了能够使用custom callbacks返回格式为json的自定义错误消息。
当我提供未知电子邮件时,我写的自定义回调被调用3次,结果为var arrayString=Array<String?>(5){null}
var nullArray= arrayOfNulls<String>(5)
。这是有道理的。
感谢任何帮助。
这是我的实施:
Unhandled rejection Error: Can't set headers after they are sent.
const localLoginStrategy = new LocalStrategy({
usernameField: "emailAddress"
}, (emailAddress, password, done) => {
// Called once
User.findOne({
where: { emailAddress }
}).then((existingUser) => {
// Called once
if (!existingUser) { return done(null, false, { message: "Invalid email/password combination", status: 401 }); }
return existingUser.comparePassword(password);
}).then((userData) => {
return done(null, userData);
}).catch((err) => {
return done(null, false, { message: "Invalid email/password combination", status: 401 });
});
});
passport.use(localLoginStrategy);
答案 0 :(得分:1)
您多次调用done
函数。
我相信当您使用return done(...)
方法拨打then
时,下一个then
会再次致电done
。
这就是为什么来自callback
的{{1}}函数被更多地按时调用的原因。
希望它有所帮助。
答案 1 :(得分:1)
要检查强制请求正文字段,请创建一个通用中间件,该中间件将检查必填字段并返回相应的返回代码。就像下面一样。
module.exports = function checkParams(params) {
params = params || [];
return function(req, res, next) {
var valid = true;
if(Array.isArray(params)) {
params.forEach(function(_param) {
valid = valid && !!req.body[_param];
});
}
if (valid) { next() } else {return res.status(400).end();} //this is for missing required parameters
};
};
现在让我们假设你有两个API。登录和CreateUser。 API路线应如下所示
app.post('/Login', checkParams(['emailAddress', 'password']), passport.authenticate('local', { failureRedirect: '/login' }), actualLoginMethod);
app.post('/CreateUser', checkParams(['userName', 'Phone']), passport.authenticate('local', { failureRedirect: '/login' }), actualCreateUserMethod);
如果缺少这些参数中的任何一个(/ CreateUser中的userName和Phone,以及/ Login中的电子邮件地址和密码),那么它将返回400状态并从该点停止执行,您可以根据需要更改checkParams的逻辑。 / p>
如果需要参数,那么它将检查JWT本地策略。一旦请求到达两个检查点,它就会调用实际方法。
希望这对你有所帮助。