我是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.write
或res.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()
}