我正在为快速路由器创建一个中间件,它将为每个请求和响应执行一些代码.拦截请求很容易,并且有很多例子,但我没有找到任何优雅的方法来拦截响应.经过一些研究,我提出的最好的方法是替换响应对象的send函数,如下面的代码片段所示:
const express = require('express');
const app = express();
var router = express.Router();
var port = process.env.PORT || 3000;
router.get('/test', function(req, res) {
res.send({
message: "testing"
});
});
app.use(function(req, res, next){
console.log("INTERCEPT-REQUEST");
const orig_send = res.send;
res.send = function(arg) {
console.log("INTERCEPT-RESPONSE");
orig_send.call(res, arg);
};
next();
});
app.use("/api", router);
app.listen(process.env.PORT || 3000) && console.log("Running");
Run Code Online (Sandbox Code Playgroud)
这种方法存在一个问题:出于某种原因,"INTERCEPT-RESPONSE"会在控制台中打印两次,这意味着res.send被调用两次......
我可以在第一次调用res.locals时设置一个标志,以避免两次处理响应,但我想知道为什么res.send被调用两次?
我正在编写一个将配置文件上传到远程服务器的剧本,但远程服务器没有安装 python(这是使用模块的要求)。我已经成功地使用原始功能编写了其他剧本,以避免在服务器上安装 python,但我在 Ansible 文档中找不到任何示例来使用准系统 ssh 执行文件上传。是否可以基于非模块上传?