快速获取原始请求以及正文中的正文

时间:2018-01-15 19:21:16

标签: node.js http express

我有一个明确的应用程序处理邮件请求正文,如下:

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

当我遇到错误时,我需要这样做。

3 个答案:

答案 0 :(得分:1)

express有一个很棒的中间件用于记录enter image description here的请求 您可以定义自己的自定义日志格式

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();
});