我有这种快速路线似乎拒绝渲染玉石模板。当我把错误的玉石模板字符串放入其中时,我得到通常无法找到被渲染到浏览器的文件。
但是当我有正确的人时,没有任何事情发生......
此外,当我在$( "#modal-layer" ).load( "/exit.php", { "name": <?php echo $name); ?>} );
之后加res.status(500).send()
时,我最终得到500错误或我选择放入其中的任何其他代码。
这里发生了什么?
res.render()
&#13;
答案 0 :(得分:0)
如果您想要渲染模板,则不需要res.send(html);
,只需从res.render()
删除回调,它就可以正常工作。并且当res.status(500).send();
显示500时,由于res.render()
和res.send()
后面的语句将会执行,连接不会终止,您可以使用return res.render()
和return res.send()
然后控件不会转到res.status(500).send()
希望它有所帮助:)
答案 1 :(得分:0)
整个stuff.save()
回调不正确,因为您永远不会返回res.render()
的结果。但是,res.render()
已被执行,因为您将回调传递给res.render()
,它不会自动响应请求。
res.render(view [, locals] [, callback])
呈现视图并将呈现的HTML字符串发送到客户端。可选参数:
locals ,一个对象,其属性定义视图的局部变量。
回调,一个回调函数。如果提供,则该方法返回可能的错误和呈现的字符串,但不执行自动响应。发生错误时,该方法在内部调用next(错误)。
由于res.render()
功能未阻止,您的stuff.save()
回调会继续执行res.status(500).send()
并作出响应。最终,您的视图不会呈现,您的左侧会收到500内部服务器错误作为响应。
重要的是要注意,在做出响应时,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);
});
}
});