Как получить информацию о пользователе из сообщения, сделанного пользователем в mongoDB - PullRequest
0 голосов
/ 28 января 2020

У меня есть Пользователь модель и Пост модель. Теперь только зарегистрированные пользователи могут создавать новые сообщения. Теперь, когда сообщение отправлено, я хочу получить информацию о нем, а также информацию о пользователе. Если вы видите, я использовал

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 })
            }
        })
    }

Этого не должно быть. Нет

1 Ответ

0 голосов
/ 28 января 2020

Вы можете поместить идентификатор зарегистрированного пользователя в запрос в вашем промежуточном программном обеспечении для аутентификации и получить доступ к идентификатору пользователя в вашем маршруте.

Допустим, у вас есть такое промежуточное программное обеспечение для аутентификации:

const jwt = require("jsonwebtoken");

module.exports = function(req, res, next) {
  let token;
  if (
    req.headers.authorization &&
    req.headers.authorization.startsWith("Bearer")
  ) {
    token = req.headers.authorization.split(" ")[1];
  }

  if (!token) return res.status(401).send("Access denied. No token provided.");

  try {
    const decoded = jwt.verify(token, "JWT_PRIVATE_KEY");
    req.user = decoded;
    next();
  } catch (ex) {
    res.status(400).send("Invalid token.");
  }
};

Я полагаю, вы отправляете токен авторизации в заголовке авторизации в формате Bearer TOKEN....... Если вы отправляете токен в другом заголовке, вам нужно настроить код так, чтобы он считывался соответствующим образом.

Теперь, когда вы применяете это промежуточное ПО для своего маршрута, вы можете прочитать идентификатор пользователя из запроса и использовать его.

const Post = require("../models/post");
const auth = require("../middleware/auth");

router.post("/posts", [auth], async (req, res) => {
  const result = await Post.create({
    title: req.body.title,
    description: req.body.description,
    user: req.user._id //comes from auth middleware
  });

  res.send(result);
});

Чтобы это работало, вам нужно включить идентификатор пользователя в токен, когда вы его подписываете.

const token = jwt.sign({ _id: user._id }, "JWT_PRIVATE_KEY");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...