我有一个使用Node.js构建并表达的小型api。 我正在尝试创建一个记录器,我需要记录请求正文和响应正文。
app.use((req, res) => {
console.log(req);
res.on("finish", () => {
console.log(res);
});
});
“表达”:“ ^ 4.16.3”,
但是,我无法在req或res对象中找到该主体。请告诉我我怎么能得到它们。谢谢。
答案 0 :(得分:4)
您需要body-parser才能在您的请求中为您创建主体对象。
为此
npm install body-parser
var bodyParser = require('body-parser')//add this
app.use(bodyParser())//add this before any route or before using req.body
app.use((req, res) => {
console.log(req.body); // this is what you want
res.on("finish", () => {
console.log(res);
});
});
答案 1 :(得分:4)
对于res.body
,请尝试以下代码段:
const endMiddleware = (req, res, next) => {
const defaultWrite = res.write;
const defaultEnd = res.end;
const chunks = [];
res.write = (...restArgs) => {
chunks.push(new Buffer(restArgs[0]));
defaultWrite.apply(res, restArgs);
};
res.end = (...restArgs) => {
if (restArgs[0]) {
chunks.push(new Buffer(restArgs[0]));
}
const body = Buffer.concat(chunks).toString('utf8');
console.log(body);
defaultEnd.apply(res, restArgs);
};
next();
};
app.use(endMiddleware)
// test
// HTTP GET /
res.status(200).send({ isAlive: true });
答案 2 :(得分:1)
这是一个使用内置 PassThrough 流的工作示例。请记住使用 express.json()
内置中间件来启用请求正文解析。
之后,您需要拦截对响应流的所有写入。调用 write
或 end
时会发生写入,因此请替换这些函数并在单独的流中捕获参数。
使用 res.on('finish', ...)
将所有写入的数据收集到使用 Buffer.concat
的缓冲区中并打印出来。
const express = require('express');
const { PassThrough } = require('stream')
const app = express();
app.use(express.json());
app.use((req, res, next) => {
const defaultWrite = res.write.bind(res);
const defaultEnd = res.end.bind(res);
const ps = new PassThrough();
const chunks = [];
ps.on('data', data => chunks.push(data));
res.write = (...args) => {
ps.write(...args);
defaultWrite(...args);
}
res.end = (...args) => {
ps.end(...args);
defaultEnd(...args);
}
res.on('finish', () => {
console.log("req.body", req.body);
console.log("res.body", Buffer.concat(chunks).toString());
})
next();
})
app.use('/', (req, res) => {
res.send("Hello");
});
app.listen(3000);
答案 3 :(得分:0)
安装npm install body-parser
并使用此代码段
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// create application/json parser
var jsonParser = bodyParser.json()
to get json response
app.use(jsonParser, function (req, res) {
console.log(req.body); // or console.log(res.body);
})
答案 4 :(得分:0)
有现成的模块https://www.npmjs.com/package/morgan-body
const express = require('express')
const morganBody = require("morgan-body")
const bodyParser = require("body-parser")
const app = express()
const port = 8888
// must parse body before morganBody as body will be logged
app.use(bodyParser.json());
// hook morganBody to express app
morganBody(app, {logAllReqHeader:true, maxBodyLength:5000});
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
答案 5 :(得分:0)
遇到了这个问题,但不喜欢解决方案。一个简单的方法是简单地用你的记录器包装原始 res.send 或 res.json。
把它作为中间件放在你的路由之前。
app.use(function responseLogger(req, res, next) {
const originalSendFunc = res.send.bind(res);
res.send = function(body) {
console.log(body); // do whatever here
return originalSendFunc(body);
};
next();
});
https://github.com/expressjs/express/blob/master/lib/response.js
res.send 有 function(body) 的签名 { return this; }