这是我的注册路线。如果注册成功,我想重定向到秘密路线。但是响应不起作用。当它成功时,页面会继续加载和加载,并且不会将我重定向到秘密路径。
app.post('/register', function(req, res) {
User.create({
username: req.body.username,
password: req.body.password,
email: req.body.email
}, function(err, result, res) { **HERE**
if(err) throw err;
res.redirect('/secret');
console.log(result);
});
});
我试过这个并且/ secret路由有效,但是当我这样做时,它不检查注册错误并立即重定向到秘密路由。
app.post('/register', function(req, res) {
User.create({
username: req.body.username,
password: req.body.password,
email: req.body.email
}, function(err, result) { **HERE**
if(err) throw err;
console.log(result);
});
res.redirect('/secret');
});
我试图添加返回错误。因此,如果出现错误,该功能将退出。 但是,当我故意在注册中出错时,仍然会显示/ secret路径。所以返回不会退出函数。
app.post('/register', function(req, res) {
User.create({
username: req.body.username,
password: req.body.password,
email: req.body.email
}, function(err, result) {
if(err) return err; **TRIED RETURN TO EXIT**
});
res.redirect('/secret');
});
答案 0 :(得分:1)
它继续加载和加载表明create user函数在回调中返回错误。或者在回调中发生错误。
如果出现错误,可能无法发送响应,这将导致悬空请求。
在您的代码中,原因是您必须从创建用户回调中删除res
,否则您将隐藏middelware回调的原始res
,这将导致错误。但是,当创建用户本身导致错误时,您还必须处理这种情况。
你的回调可能看起来那样:
function(err, result) {
if(err) {
res.status(500).send('an error occured')
} else {
res.redirect('/secret');
console.log(result)
}
}
回调应该如何显示取决于您在错误的情况下想要做什么。您可能还想选择一个与500
不同的错误代码,以便更好地匹配。
答案 1 :(得分:-1)
我相信您会将普通NodeJS中基于回调的异步编程特性与常规顺序编程混淆。
对User.create
的调用将立即返回,其后的行将在您提供的回调中的任何内容之前执行。因此,您的res.redirect()
调用将触发重定向到客户端的即时响应。当回调最终运行时,请求已完成。
相反,您需要在检查潜在错误后执行回调函数内部的重定向。
您的代码应该看起来像这样:
app.post('/register', function(req, res) {
User.create({
username: req.body.username,
password: req.body.password,
email: req.body.email
}, function(err, result) {
if(err) throw err;
// Since we got here, things went well presumably
res.redirect('/secret');
});
});