Node / Express,如何修改静态文件但仍可访问req.params?

时间:2015-05-29 17:57:42

标签: node.js express

我是node / express的新手,所以(希望)有一个明显的答案我不知道。

有一个用于转换静态内容的中间件:https://www.npmjs.com/package/connect-static-transform/。转换函数如下所示:

transform: function (path, text, send) {
   send(text.toUpperCase(), {'Content-Type': 'text/plain'});
}

所以,这对于在服务之前转换内容非常有用,但它不会让我看看查询参数。

这个答案显示了如何做到Connect or Express middleware to modify the response.body

function modify(req, res, next){
   res.body = res.body + "modified";
   next();
}

但我无法弄清楚如何让它与静态文件内容一起运行。当我运行时res.body未定义。

express.static之后是否有办法让中间件运行

我的用例是我想从磁盘提供文件,根据查询参数的值对某些文本进行小的替换。使用服务器端模板很容易,比如Flask。但我希望用户能够进行简单的npm-install并启动一个小型服务器来执行此操作。由于我是节点和表达的新手,我想省去阅读网址,将文件定位在磁盘上并阅读它的麻烦。但是很明显我浪费了更多的时间来尝试这种方法。

2 个答案:

答案 0 :(得分:0)

答案似乎是"没有答案。" (正如Pomax在评论中所建议的那样。)这真的很烦人。我自己并没有花太多时间来弄清楚如何服务和转换文件,但现在我不得不弄清楚错误处理。已有一百万人编写了此代码。

答案 1 :(得分:0)

您可以创建仅对使用 res.writeres.end 或其他内容编写的正文块进行转换的中间件。

例如:

const CSRF_RE = /<meta name="csrf-token" content="(.*)"([^>]*)?>/

function transformMiddleware (req, res, next) {
  const _write = res.write
  res.write = function(chunk, encoding) {
    if (chunk.toString().indexOf('<meta name="csrf-token"') === -1) {
      _write.call(res, chunk, encoding)
    } else {
      const newChunk = chunk.toString().replace(CSRF_RE, `<meta name="csrf-token" content="${req.csrfToken()}">`)
      _write.call(res, newChunk, encoding)
    }
  }
  next()
}