Res.render()不渲染

时间:2016-03-22 00:19:33

标签: javascript node.js express

我有这种快速路线似乎拒绝渲染玉石模板。当我把错误的玉石模板字符串放入其中时,我得到通常无法找到被渲染到浏览器的文件。

但是当我有正确的人时,没有任何事情发生......

此外,当我在$( "#modal-layer" ).load( "/exit.php", { "name": <?php echo $name); ?>} ); 之后加res.status(500).send()时,我最终得到500错误或我选择放入其中的任何其他代码。

这里发生了什么?

&#13;
&#13;
res.render()
&#13;
&#13;
&#13;

2 个答案:

答案 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);
    });
  }
});