如何修改静态文件,但仍然可以访问req.params



我是node/express的新手,所以(希望)有一个明显的答案我错过了。

有一个转换静态内容的中间件:https://www.npmjs.com/package/connect-static-transform/。转换函数看起来像:

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

所以,这对于在服务之前转换内容很好,但是它不允许我查看查询参数。

这个答案显示了如何连接或Express中间件来修改response.body:

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

但是我不知道如何让它以静态文件内容运行。当我运行它时,res.body是未定义的

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

我的用例是,我想从磁盘提供文件,根据查询参数的值对一些文本进行小替换。使用服务器端模板(比如Flask)就很容易做到这一点。但我希望用户能够做一个简单的npm-install和启动一个小服务器来做到这一点。由于我不熟悉节点和表达式,所以我想省去读取url、在磁盘上定位文件并读取它的麻烦。但是很明显,我在尝试这种方法上浪费了更多的时间。

答案似乎是"没有答案"。(正如Pomax在评论中建议的那样。)这真的很烦人。我自己没有花太长时间就弄清楚如何提供和转换文件,但现在我必须弄清楚错误处理。已经有一百万人写过这段代码了

你可以创建中间件,只做体块的转换,因为他们写的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()
}

最新更新