首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Morgan中有记录响应体的方法吗?

在Morgan中有记录响应体的方法吗?
EN

Stack Overflow用户
提问于 2019-07-25 05:04:59
回答 3查看 5.3K关注 0票数 4

我想在我的日志文件中记录响应正文

我已经尝试了morgan-body,但我想将响应记录在一个文件中,而不是控制台中

下面的代码将记录请求正文,那么是否也有记录响应的方法呢?

代码语言:javascript
复制
morgan.token('body', function (req, res) { return JSON.stringify(req.body) });

app.use(morgan(':method :url :status :response-time ms - :res[content-length] :body - :req[content-length]', { 
  stream: logger.successLogStream,
  skip: function (req, res) { return res.statusCode >= 400 }
 }));

 app.use(morgan(':method :url :status :response-time ms - :res[content-length] :body - :req[content-length]', { 
  stream: logger.errorLogStream,
  skip: function (req, res) { return res.statusCode < 400 }
 }));

例如,我想要记录以下错误消息

代码语言:javascript
复制
return res.status(400).send({ "message": "Campaign id is not defined" })
EN

回答 3

Stack Overflow用户

发布于 2019-07-25 11:36:04

覆盖res.send / res.json方法,customize :res-body,并小心地在路由之后放置摩根

代码语言:javascript
复制
morgan.token('resBody', (req, res) => res.resBody);
res.send = (...args) => {
    res.oldsend(...args);
    res.resBody = JSON.stringify(args);
};
app.use(routes)
app.use(morgan(...))
票数 1
EN

Stack Overflow用户

发布于 2020-07-16 14:03:57

你可以使用这个

代码语言:javascript
复制
const app = express()
const originalSend = app.response.send

app.response.send = function sendOverWrite(body) {
  originalSend.call(this, body)
  this.__custombody__ = body
}

morgan.token('res-body', (_req, res) =>
  JSON.stringify(res.__custombody__),
)

...

app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use(morgan(loggerFormat, { stream: logStream }))
app.use(...routers)
票数 1
EN

Stack Overflow用户

发布于 2021-10-13 14:06:50

使用node v16和摩根自定义日志格式更新上述答案

middleware.ts

代码语言:javascript
复制
 export const setResponseBody = (req: any, res: any, next: any) => {
    const oldWrite = res.write,
        oldEnd = res.end,
        chunks: any = [];

    res.write = function (chunk: any) {
        chunks.push(Buffer.from(chunk));
        oldWrite.apply(res, arguments);
    };

    res.end = function (chunk: any) {
        if (chunk) {
            chunks.push(Buffer.from(chunk));
        }
        const body = Buffer.concat(chunks).toString('utf8');
        res.__custombody__ = body;
        oldEnd.apply(res, arguments);
    };
    next();
};

app.ts

代码语言:javascript
复制
morgan.token('responseBody', function (req, res: any) {
    if (res['statusCode'] != 200) {
        return res['__custombody__'] || null;
    }
    return null;
});
const app = express();
app.use(morgan('responseBody=:responseBody'));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57191236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档