Как заполнить в NodeJS и пн goose пост, который нужно отнести к имени пользователя - PullRequest
0 голосов
/ 22 января 2020

У меня возникла проблема в моем NodeJs API и Пн go, где я должен опубликовать и заполнить имя пользователя строкой в ​​поле Имя пользователя.

Когда я публикую сообщение, я получаю эту ошибку:

"Ошибка типа: newPost.save (...). Заполнение не является функцией"

Модель поста:

const mongoose = require("mongoose");

const schema = {
    text: {
        type: String,
        required: true,
        unique: true
    },

    username: {
        type: mongoose.Schema.Types.String,
        ref: "Profile",
        required: true
    },

    image: {
        type: String,
        default: "https://via.placeholder.com/150",
        required: false
    },
    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    }
};

const collectionName = "posts";
const postSchema = mongoose.Schema(schema);
const Post = mongoose.model(collectionName, postSchema);

module.exports = Post;

Здесь я делаю метод поста:

postRouter.post("/", async (req, res) => {
    try {
        const newPost = await Posts.create(req.body);

        const username = await Profiles.findOne({
            username: req.body.username
        });

        if (!username) res.status(400).send("Username not found");

        newPost.save().populate(username.username);

        res.send({ success: "Post added", newPost });
    } catch (error) {
        res.status(500).send(error);
        console.log(error);
    }
});

Вывод ответа, как должно быть:

{
        "_id": "5d93ac84b86e220017e76ae1", //server generated
        "text": "this is a text 12312 1 3 1",  <<--- THIS IS THE ONLY ONE SENDING"
        "username": "admin",<-- FROM REQ.body or params ??? 
        "createdAt": "2019-10-01T19:44:04.496Z", //server generated
        "updatedAt": "2019-10-01T19:44:04.496Z", //server generated
        "image": ... //server generated on upload, set a default here
    }

Я буду Также будьте рады узнать, имеет ли смысл идея подобного маршрута, поскольку в сообщении необходимо указать имя пользователя, если лучше указать его в теле или в параметрах запроса.

Ответы [ 3 ]

1 голос
/ 22 января 2020

Вам не нужно заполнять имя пользователя профиля, потому что у вас уже есть это значение в req.body.username.

Также есть несколько проблем с вашим кодом:

1-) Вы уже создали сообщение с Posts.create, поэтому нет необходимости использовать newPost.save()

2-) Если newPost.save() не нужно удалять, вам нужно добавить await.

3-) Если newPost.save() не нужно удалять, вы не можете использовать заполнение после сохранения.

4-) Вам необходимо вернуть ответ в случае 400, с вашим кодом, кодом будет выполняться, когда регистр 400.

5-) В блоке catch вы никогда не увидите console.log(error)

6-) Вы создаете сообщение, и после того, как проверите, существует ли имя пользователя в профиле , Правильно сначала проверить, существует ли имя пользователя, и только после того, как оно найдено, затем создать сообщение.

Поэтому код должен быть таким:

postRouter.post("/", async (req, res) => {
  try {
    const { username } = req.body;

    const profile = await Profiles.findOne({ username });

    if (!profile) {
      return res.status(400).send("Username not found");
    }

    let newPost = await Posts.create(req.body);
    newPost.username = username;

    res.send({ success: "Post added", newPost });
  } catch (error) {
    console.log(error);
    res.status(500).send(error);
  }
});
1 голос
/ 22 января 2020

попробуйте код ниже, учитывая, что req.body.username будет mon goose идентификатор объекта

postRouter.post("/", async (req, res) => {
  try {

    const username = await Posts.findOne({
      username: req.body.username
    });

    if (!username) {
      res.status(400).send("Username not found");
    } else {
      const newPost = await Posts.create(req.body); //might need remove if double entry created
      const post = await Posts.populate(newPost, {
        path: 'username'
      })
      res.send({
        success: "Post added",
        newPost
      });

    }
  } catch (error) {
    res.status(500).send(error);
    console.log(error);
  }
});
1 голос
/ 22 января 2020

Когда я пишу, я получаю эту ошибку: «Ошибка типа: newPost.save (...). Заполнение не является функцией»

Вы просто используете populate на save тип возвращаемого значения (из документации API ) Promise. Обещание нужно дождаться до вызова populate.

postRouter.post("/", async (req, res) => {
    try {
        const newPost = await Posts.create(req.body);

        const username = await Profiles.findOne({
            username: req.body.username
        });

        if (!username) res.status(400).send("Username not found");

        const addedPost = await newPost.save();  // <-- Here
        addedPost.populate(username.username);   // <-- Then populate here

        res.send({ success: "Post added", newPost });
    } catch (error) {
        res.status(500).send(error);
        console.log(error);
    }
});

Я также буду рад узнать, имеет ли идея такой маршрут смысл, поскольку пост должен иметь имя пользователя, если лучше иметь его в теле или в параметрах запроса.

  • Ваш маршрут кажется / для создания нового сообщения. Может быть более понятным назвать его /post.

  • Если вы введете имя пользователя в запросе, например: /post/:username Это ясно, что сообщение нужно имя пользователя. Но вы не могли сделать другую информацию, необходимую. Таким образом, если ваше приложение расширяется и вам нужен еще один необходимый параметр, вы должны внести критические изменения в маршрут API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...