要回答问题1),由于您所说的额外表单验证不是护照流程的一部分,我建议将其保存在与config/passport.js 分开的自己的中间件中。您可以定义您的函数,类似于已经存在的isLoggedIn helper。像这样:
function validateSignup(req, res, next) {
// Perform your field validation and/or CAPTCHA checking here
if (!verifyCaptcha(req.body)) {
return res.status(401).end();
}
next();
}
app.post('/signup', validateSignup, passport.authenticate('local-signup', {
successRedirect : '/profile', // redirect to the secure profile section
failureRedirect : '/signup', // redirect back to the signup page if there is an error
failureFlash : true // allow flash messages
}));
对于2) 及以后,
我想,如果出现错误,用错误消息呈现表单,但也用输入的数据填充所有输入文本。
我认为实现这一点的最简单方法是将您的注册/登录 POST 作为 AJAX 请求而不是进行传统的表单提交,并让您的 POST 路由返回 JSON 结果而不是呈现 HTML 页面。这样您的页面不会刷新,并且您的表单值将保持原样。粗略地说,使用 jQuery,您的客户端代码可能看起来像这样:
$("#signup-form").submit(function(e){
// Prevents your form from submitting as usual
e.preventDefault();
$.post('/signup', $('#theform').serialize())
.done(function() {
// Success! Navigate to home page
})
.fail(function(jqXHR, textStatus, errorThrown) {
// Show error in UI
});
});
要在您的 UI 中突出显示表单错误,那就是另一回事了,这取决于您使用的框架。例如,如果您使用引导程序,我会推荐 bootstrapValidator。
在同一个函数中处理 GET 和 POST 更好吗?
不,我肯定会将这些路线分开。此外,如果您确实选择遵循上面的 AJAX 建议,我会发现如果我将我的 HTML 服务路由组织在与我的 JSON 路由不同的路径下会更容易。例如,如果我有一个显示注册页面的 signup 路由,以及一个用于发布注册表单的 JSON 端点,我会这样组织它:
GET /signup
POST /api/signup