我正在尝试确定我是否可以同时调用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值而不是正在呈现的页面,我的控制台抛出了一个错误:在发送后无法设置标题。
答案 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。