Node.js 如何在morgan()中间件中获取请求主体?

Node.js 如何在morgan()中间件中获取请求主体?,node.js,express,http,morgan,Node.js,Express,Http,Morgan,我正在学习如何使用中间件,有一项任务是使用morgan()中间件发布JSON资源。但是,当我写一个代码发布一些东西时,我无法得到摩根的尸体 const express = require('express'); const morgan = require('morgan'); const app = express(); app.use(morgan('tiny')); const generateId = () => { const randNum = Math.floor(

我正在学习如何使用中间件,有一项任务是使用
morgan()
中间件发布JSON资源。但是,当我写一个代码发布一些东西时,我无法得到摩根的尸体

const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('tiny'));

const generateId = () => {
    const randNum = Math.floor(Math.random() * 5000)
    return randNum;
}

const isExist = (arr, name) => {
    const found = arr.find(arrItem => arrItem.name === name) ? true : false
    return found;
}
app.post('/api/persons', (req, res) => {
    const body = req.body
    if (!body.name || !body.number) {
        return res.status(400).json({
            error: "missing data"
        })
    } else if (isExist(notes, body.name) === true) {
        return res.status(400).json({
            error: "existed data"
        })
    }
    const note = {
        id: generateId(),
        name: body.name,
        number: body.number
    }
    notes = notes.concat(note)

    res.json(note)
})
const PORT = 3001;
app.listen(PORT, () => {
    console.log(`Server is worling on ${PORT}`)
})
然后我找到了摩根的尸体并用了它,它成功了

// ...
const morganBody = require('morgan-body')
const bodyParser = require('body-parser')

app.use(bodyParser.json())
morganBody(app)

app.post('/api/persons', (req, res) => {
    // the same code as the above
}
//...
但是现在,任务是在控制台中更改日志,如 我对在一个后端中使用两个中间件感到有点不舒服(不知道这是否合适)。这就是为什么我面临这种情况的潜在解决方案的问题:

  • 如何获取
    morgan()
    的请求主体(以日志和js代码的格式),以摆脱
    morgan主体
    并编写我的自定义令牌
  • 如何为
    morgan body
    编写自定义令牌(找不到任何相关文档)以摆脱
    morgan()
  • 因为我是一个初学者,所以听听哪个选项更可取,为什么更可取会很有帮助。如果需要任何其他信息或我的问题有问题,请随时指出。
    提前感谢。

    首先,您可以拥有任意数量的中间件,对于大型应用程序,它们往往拥有大量中间件

    要为morgan创建自定义令牌,您可以执行以下操作:

    morgan.token('body',req=>{
    返回JSON.stringify(req.body)
    })
    app.use(morgan(':method:url:body'))
    
    如果设置了
    req.body
    ,这应该可以正常工作,但默认情况下不是这样。您必须使用主体解析中间件来填充它

    因此,在使用morgan中间件之前,您必须放置一些主体解析器:

    app.use(express.json())
    app.use(morgan(':method:url:body'))
    
    注意:
    express.json
    是express中内置的中间件功能。看更多