我可以一起使用'res.sendFile'和'res.json'吗?

时间:2015-07-16 17:59:47

标签: javascript node.js express

目前我在Express应用程序中使用控制器来处理路由。当某条路线被点击时,我会拨打pagesController.showPlayer,为index.html提供服务。这是控制器:

'use strict';

var path = require('path');

var player = function(req, res) {
  res.sendFile(path.join(__dirname, '../assets', 'index.html'));
};

module.exports = {
  player: player
};

我还需要发回一个JSON对象,表示请求此路由的用户。 但是,当我添加res.json({user: req.user});时,我得到的是这个JSON对象,index.html不再显示。

1 个答案:

答案 0 :(得分:7)

res.json()表示Express应用在收到HTTP请求时发送的HTTP响应。另一方面,res.sendFile()在给定路径上传输文件。

在这两种情况下,流程基本上都转移给可能已发出请求的客户。

所以不,你不能一起使用res.sendFileres.json

但是,您确实没有什么办法来达到预期的目标:

res.sendFile具有以下签名:

res.sendFile(path [, options] [, fn])

其中path必须是文件的绝对路径(除非在options对象中设置了root选项)。

options中,您可以指定包含要与文件一起提供的HTTP标头的object

示例:

  var options = {
    headers: {
        'x-timestamp': Date.now(),
        'x-sent': true,
        'name': 'MattDionis',
        'origin':'stackoverflow' 
    }
  };

res.sendFile(path.join(__dirname, '../assets', 'index.html'), options);

这确实是你能够做到最接近所期望的任务。还有其他选择..

  • 喜欢在cookie中设置内容(但这将是每个后续req / res循环的一部分),或
  • 仅发送json响应(使用res.json)并在客户端管理路由(而nodejs将作为API端),或
  • 设置包含作用于请求的变量的res.locals对象,因此仅对在请求/响应周期中呈现的视图(如果有)提供

希望它有帮助!