У меня есть Пользователь модель и Пост модель. Теперь только зарегистрированные пользователи могут создавать новые сообщения. Теперь, когда сообщение отправлено, я хочу получить информацию о нем, а также информацию о пользователе. Если вы видите, я использовал
userId: { type: Schema.Types.ObjectId, ref: "User" }
для ссылки на модель Пользователь .
Скажите, в тестере API Почтальон, что я должен ввести в качестве тела?
{
"title": "abcd",
"description": "efgh",
//should userId be automatically generated or I have to enter here
}
Я знаю, что слаг генерируется автоматически, но как насчет информации о пользователе? Я запутался здесь? И как я могу получить информацию о пользователе из userId? (У меня есть маршрут /users/:id
, но я не знаю, как его использовать в этом случае)
Модель пользователя
const userSchema = new Schema({
username: { type: String, required: true },
email: { type: String, required: true },
password: { type: String, required: true },
}, { timestamps: true })
Пост-модель
const postSchema = new Schema({
title: { type: String, required: true },
description: { type: String, required: true },
userId: { type: Schema.Types.ObjectId, ref: "User" },
slug: { type: String, slug: "title" }
}, { timestamps: true }
authmiddleware. js
function generateToken(payload) {
return jwt.sign(payload, "secret")
}
function verifyToken(req, res, next) {
const token = req.headers.Authorization
if (!token) return res.json({ msg: "unauthorized"})
jwt.verify(token,"secret",(err, decoded) => {
if (err) return res.json({ error: "unuthorized" })
req.user = decoded
next()
})
}
module.exports = {generateToken, verifyToken }
маршрутов / сообщений. js
router.post("/new", authmiddleware.verifyToken, postControllers.newPost)
postControllers / newPost. js
newPost: (req, res) => {
Post.create(req.body, (err, newPost) => {
if (err) console.log(err)
if (!newPost) {
return res.json({ message: "No post found" })
} else if (newPost) {
return res.json({ post: newPost })
}
})
}
Когда я зарегистрировался в почтальоне, введя эту информацию в качестве тела (и отправив токен в заголовках)
{
"title": "My first post",
"description": "My first post description"
}
Я получил такой результат:
{
"post": {
"_id": "5e3028ded3e24b55e06baaf2",
"title": "My first post",
"description": "My first post description"
"createdAt": "2020-01-28T12:28:14.331Z",
"updatedAt": "2020-01-28T12:28:14.331Z",
"slug": "my-first-post",
"__v": 0
}
}
Но я также хочу получить информацию о пользователе в этом.
Обновление : Итак, я получил userId во вновь созданном post объекте.
Я делал это раньше:
newPost: (req, res) => {
Post.create(req.body, req.user.userId, (err, newPost) => {
if (err) console.log(err)
if (!newPost) {
return res.json({ message: "No post found" })
} else if (newPost) {
return res.json({ post: newPost })
}
})
}
И получил и ошибка:
{
"error": {
"message": "Parameter \"obj\" to Document() must be an object, got 5e2f365d41ff66569445eec2",
"name": "ObjectParameterError"
}
}
Тогда я сделал это, я получил результат:
newPost: (req, res) => {
const data = {
title: req.body.title,
description: req.body.description,
userId: req.user.userId
}
Post.create(data, (err, newPost) => {
if (err) console.log(err)
if (!newPost) {
return res.json({ message: "No post found" })
} else if (newPost) {
return res.json({ post: newPost })
}
})
}
Этого не должно быть. Нет