#node.js #express #http #morgan
Вопрос:
Я учусь работать с промежуточными программами, и есть задача опубликовать ресурс JSON с помощью 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}`)
})
Потом я нашел тело Моргана и использовал его, и это сработало.
// ...
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
}
//...
Но теперь задача состоит в том, чтобы изменить журнал в консоли следующим образом
Мне немного неудобно использовать 2 промежуточных программного обеспечения в 1 бэкэнде (не знаю, нормально ли это). Вот почему я столкнулся с проблемами, связанными с потенциальными решениями этой ситуации:
- Как получить
morgan()
тело запроса (как в формате журнала, так и в коде js), чтобы избавиться отmorgan-body
моих пользовательских токенов и написать их? - Как написать пользовательские токены (не удалось найти никакой документации по этому поводу)
morgan-body
, чтобы избавиться отmorgan()
них ?
Поскольку я новичок, было бы полезно услышать, какой вариант предпочтительнее и почему он таков. Если потребуется какая-либо дополнительная информация или что-то не так с моим вопросом, не стесняйтесь указывать на это. Заранее спасибо.
Ответ №1:
Во-первых, у вас может быть столько промежуточного программного обеспечения, сколько вы хотите, а для больших приложений, как правило, много промежуточного программного обеспечения.
Чтобы создать пользовательский токен для 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. Подробнее смотрите здесь.