我有这个好像是拒绝渲染玉模板的快递路线。当我输入错误的 jade 模板字符串时,我通常无法找到正在呈现给浏览器的文件。
但是当我有正确的那个时,什么也没有发生......
此外,当我在
res.status(500).send()
之后放置一个 res.render()
时,我最终会收到 500 错误或我选择放入其中的任何其他代码。
这里发生了什么?
app.post('/stuff/new', function (req,res){
Stuff.findById(req.body.booking_id, function(err, stuff){
if(err){ console.log("Err", err)}
else if (booking) {
Thungs.findById(req.body.user_id, function(err, thung){
user.stuff.push(req.body.things);
user.save();
});
Thingers.findById(req.body.center_id, function(err, thinger){
center.stuff.push(req.body.things);
center.save();
});
stuff.prop = 'thing';
stuff.save(function(err, result){
if (err) { console.err("err", err) }
else {
res.render('booking/thank_you', {
url: req.url,
id: "thank_you"
}, function(err, html){
if (err) { console.err("ERR", err) }
else {
res.send(html);
}
});
res.status(500).send();
}
});
}
})
});
如果你只是想渲染模板,你不需要
res.send(html);
,只需从res.render()
中删除回调它应该可以正常工作。而且当 res.status(500).send();
显示 500 时,因为在 res.render()
和 res.send()
之后连接没有终止,它们后面的语句将执行,您可以使用 return res.render()
和 return res.send()
然后控制不会去 res.status(500).send()
希望有帮助:)
整个
stuff.save()
回调是不正确的,因为您永远不会返回 res.render()
的结果。但是,您的 res.render()
会被执行,因为您将回调传递给 res.render()
它不会自动响应请求。
res.render(视图 [, locals] [, callback])
呈现视图并将呈现的 HTML 字符串发送到客户端。可选参数:
locals,一个对象,其属性定义视图的局部变量。
callback,回调函数。如果提供,该方法返回可能的错误和呈现的字符串,但不执行自动响应。当发生错误时,该方法会在内部调用 next(err)。
由于
res.render()
函数没有阻塞,您的 stuff.save()
回调继续执行到 res.status(500).send()
并响应。最终你的视图没有被渲染,你的左边得到一个 500 Internal Server Error 作为响应。
需要注意的是,在几乎所有场景下
return
在做响应时想要在响应后停止执行是一个“最佳实践”。唯一不想在回复时使用 return
的情况是之后需要执行某种类型的清理程序。
下面的代码在成功时正确返回
res.render()
,在发生错误时正确返回res.status(500)
。
stuff.save(function(err, result){
if (err) {
console.err("err", err)
// An error occurred, stop execution and return 500
return res.status(500).send();
}
// No error occurred, attempt to render the view
// and return the outcome of the rendering to the callback
res.render('booking/thank_you', {
url: req.url,
id: "thank_you"
}, function(err, html){
if (err) {
console.err("ERR", err)
// An error occurred, stop execution and return 500
return res.status(500).send();
}
// Return the HTML of the View
return res.send(html);
});
}
});
如果您在 html 页面中使用 ajax 并且必须以 json 格式发送数据,这也可能导致错误。