res.send和res.render调用

时间:2015-06-15 13:56:44

标签: javascript node.js express

我正在尝试确定我是否可以同时调用res.send(数据)然后res.render(' reports')。

为了进一步详细解释,当我路由到' / reports'时,首先在我的服务器端,我对一个返回json数据的API进行REST调用。现在我希望在客户端上访问这个json数据,我正在从我的javascript进行ajax调用。因此使用res.send(),但我也希望在此调用中呈现页面

所以在我的服务器端代码

上看起来如下所示
router.get('/reports', function(req,res){
     //Making the REST Call to get the json data
     //then
     res.send(json);
     res.render('reports');
});

每次我点击' / reports'在浏览器上,我看到了json值而不是正在呈现的页面,我的控制台抛出了一个错误:在发送后无法设置标题。

4 个答案:

答案 0 :(得分:5)

不,你不能同时做到这两点,但你可以渲染页面并同时发送数据:

res.render('reports',{data:json});

然后在新呈现的页面中访问这些数据。

或者你可以在打电话时发送一个标志,然后根据这个标志决定你是想要渲染还是发送。

答案 1 :(得分:5)

您可以使用content negotiation,其中您的AJAX请求设置Accept标头,以告知您的Express服务器返回JSON而不是HTML:

router.get('/reports', function(req,res) {
  ...
  if (req.accepts('json')) {
    return res.send(theData);
  } else {
    return res.render('reports', ...);
  };
});

或者,您可以使用req.xhr检查请求是否是使用AJAX调用进行的(虽然这不是100%故障安全)。

答案 2 :(得分:3)

理想情况下,它需要是两个独立的路线,一个是吐痰的json,另一个是渲染视图。否则,你可以传递一个url参数,具体取决于你返回json或渲染视图。

router.get('/reports/json', function(req,res){
   var data = JSON_OBJECT;
   res.send(data);
});

router.get('/reports', function(req,res){
   var data = JSON_OBJECT;
   res.render('path-to-view-file', data);
});

答案 3 :(得分:0)

不,你不能。您只能对给定的请求进行一次响应。浏览器要么想要一个HTML文档,要么期待JSON,那么同时给它们两者都没有意义。

render只需呈现视图,然后调用send

您可以编写视图以输出带有<script>元素的HTML文档,该元素包含JavaScript文字形式的JSON。