如何在 morgan() 中间件中获取请求体?
How to get the request body in morgan() middleware?
我正在学习如何使用中间件,并且有一项任务是使用 morgan()
中间件 post JSON 资源。但是当我为 posting 编写代码时,我无法获取 morgan 的主体。
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}`)
})
然后我找到了 morgan-body 并使用它并且成功了。
// ...
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
}
//...
但是现在,任务是像一样更改控制台中的日志
我对在 1 个后端使用 2 个中间件有点不舒服(不知道这样是否可以)。这就是为什么我遇到这种情况的潜在解决方案的问题:
- 如何获取
morgan()
的请求正文(日志格式和 js 代码)以便摆脱 morgan-body
并编写我的自定义令牌?
- 如何为
morgan-body
编写自定义标记(找不到任何相关文档)以摆脱 morgan()
?
因为我是初学者,所以听听哪个选项更可取,为什么会这样会很有帮助。如果需要任何其他信息或我的问题有问题,请随时指出。
提前谢谢你。
首先,你可以拥有任意多的中间件,对于大型应用程序,它们往往拥有大量的中间件。
要为摩根创建自定义令牌,您可以执行以下操作:
morgan.token('body', req => {
return 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内置的中间件功能。查看更多 here.
Beginner-friendly 显示使用 morgan 在 HTTP POST 请求中发送的数据的说明:
- 此行应位于文件顶部:
app.use(morgan(':method :url :body'))
- 此行应位于 POST 请求的底部(但仍在 POST 请求内):
morgan.token('body', request => JSON.stringify(request.body))
- 完成...检查您的终端以查看 morgan
的输出
我正在学习如何使用中间件,并且有一项任务是使用 morgan()
中间件 post JSON 资源。但是当我为 posting 编写代码时,我无法获取 morgan 的主体。
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}`)
})
然后我找到了 morgan-body 并使用它并且成功了。
// ...
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-body
并编写我的自定义令牌? - 如何为
morgan-body
编写自定义标记(找不到任何相关文档)以摆脱morgan()
?
因为我是初学者,所以听听哪个选项更可取,为什么会这样会很有帮助。如果需要任何其他信息或我的问题有问题,请随时指出。 提前谢谢你。
首先,你可以拥有任意多的中间件,对于大型应用程序,它们往往拥有大量的中间件。
要为摩根创建自定义令牌,您可以执行以下操作:
morgan.token('body', req => {
return 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内置的中间件功能。查看更多 here.
Beginner-friendly 显示使用 morgan 在 HTTP POST 请求中发送的数据的说明:
- 此行应位于文件顶部:
app.use(morgan(':method :url :body'))
- 此行应位于 POST 请求的底部(但仍在 POST 请求内):
morgan.token('body', request => JSON.stringify(request.body))
- 完成...检查您的终端以查看 morgan 的输出