我有一个明确的应用程序处理邮件请求正文,如下:
var app = express();
app.use(bodyParser.text({ type: "*/*" }));
app.post(url, function(req, res) {
//Process req.body, handle the errors along the way;
});
现在如果发生了一些错误,我希望能够记录整个请求。通过这个,我的意思是标题,正文和一切。好像您正在使用wireshark查看请求。
有谁知道最简单的方法是什么?
这是一个示例HTTP POST请求(取自here):
POST / HTTP/1.1
Host: foo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
say=Hi&to=Mom
当我遇到错误时,我需要这样做。
答案 0 :(得分:1)
express有一个很棒的中间件用于记录的请求 您可以定义自己的自定义日志格式
var morgan = require('morgan')
morgan(function (tokens, req, res) {
return [
tokens.method(req, res),
tokens.url(req, res),
tokens.status(req, res),
tokens.res(req, res, 'content-length'), '-',
tokens['response-time'](req, res), 'ms'
].join(' ')
})
有skip
选项可以跳过日志记录,您必须设计自己的策略才能跳过或继续记录,例如您可以检查响应状态
var morgan = require('morgan')
morgan(function (tokens, req, res) {
return [
tokens.method(req, res),
tokens.url(req, res),
tokens.status(req, res),
tokens.res(req, res, 'content-length'), '-',
tokens['response-time'](req, res), 'ms'
].join(' ')
}, {
skip: function (req, res) { return res.statusCode == 200 }
})
答案 1 :(得分:1)
您可以使用error-handling middleware:
app.use(function(err, req, res, next) {
// define log format, for example:
let data = `URL: ${req.originalUrl} - method: ${req.method} - error: ${err.message}`;
// append to log file
fs.appendFile('server.log', data, function (err) {
if (err) throw err;
// terminate the request/response cycle
res.status(err.status || 500);
res.json({ error: err });
});
});
通过调用next(err)
跳转到错误处理中间件,例如:
app.get('some/route', function (req, res, next) {
someFunction( req.body, function (err) {
// pass err object to the error middleware
if (err) return next(err);
return res.json({ success: true });
});
});
希望这有帮助
答案 2 :(得分:1)
由于这里没有关于如何查看原始请求(标题,正文等)的任何实际答案,因此我将花两分钱。
简短的答案是:您不能。 Express无法提供该服务,基础Node http
模块doesn't either无法提供该服务。
更长的答案是:您可以在一定程度上重建它。您可以访问请求的原始标头,并将它们重新组合为原始文本。您还可以从套接字中读取原始有效载荷数据,并将其保存到req
上的属性中,然后在数据发送后立即使用。那可能无法为您提供确切的传入消息,但可以使您与您保持联系。您可以通过一些中间件来实现:
server.use((req, res, next) => {
let data = '';
req.on('data', (chunk) => {
data += chunk;
});
req.on('end', () => {
req.rawBody = data;
let headers = [`${req.method} ${req.url} HTTP/${req.httpVersion}`];
for (let i = 0; i < req.rawHeaders.length; i += 2) {
headers.push(`${req.rawHeaders[i]}: ${req.rawHeaders[i + 1]}`);
}
req.rawRequest = `${headers.join('\r\n')}\r\n\r\n${req.rawBody}`;
console.log(`Socket received data:\n\n${req.rawRequest}`);
});
next();
});