Как добавить данные в атрибут массива в MongoDB с помощью NodeJS? - PullRequest
0 голосов
/ 11 ноября 2018

Я просто хочу добавить в статью атрибут заголовка разных статей.Мой user.controller.js файл имеет эту функцию

module.exports.savearticle = (req, res, next) => {
  User.findOneAndUpdate(
    req._id,
    {
      $addToSet: { articles: req.body.articles }
    },
    {
      new: true
    },
    function(err, savedArticle) {
      if (err) {
        res.send("Error saving article");
      } else {
        res.json(savedArticle);
      }
    }
  );
};

У меня есть отдельная страница маршрутизатора, index.router.js, со всеми моими маршрутизаторами, которая включает маршрут для этой функции

router.post("/savearticle", ctrlUser.savearticle);

Imиспользуя Почтальон, чтобы проверить функцию.В форме данных я задаю ключ articles и значение article1.Мой ответ таков:

{
    "articles": [
        null
    ]
}

Почему он обнуляется?Я сделал console.log(req.body.articles) и он возвращает undefined.Почему это undefined?Разве это не должно сказать article1?

Это схема, которую я делаю на моей user.model.js странице

var userSchema = new mongoose.Schema({
  fullName: {
    type: String,
    required: "Full name can't be empty"
  },
  email: {
    type: String,
    required: "E-mail can't be empty",
    unique: true
  },
  password: {
    type: String,
    required: "Password can't be empty",
    minlength: [4, "Password must be atleast 6 characters"]
  },
  saltSecret: String,
  articles: Array
});

И это функция регистрации пользователя в user.controller.jsфайл

module.exports.register = (req, res, next) => {
  var user = new User();
  user.fullName = req.body.fullName;
  user.email = req.body.email;
  user.password = req.body.password;
  user.articles = [];
  user.save((err, doc) => {
    if (!err) {
      res.send(doc);
    } else {
      if (err.code == 11000) {
        res.status(422).send(["Duplicate email address found."]);
      } else return next(err);
    }
  });
};

1 Ответ

0 голосов
/ 11 ноября 2018

Вы используете findOneAndUpdate с недопустимыми параметрами. Сначала проверьте тип req._id (по точке останова в debug или console.log (req._id)), если это string, вы должны преобразовать его в mongoose.mongo.ObjectId.

module.exports.savearticle = (req, res, next) => {
  let userId = req._id;
  if((typeof userId) === 'string'){
     userId = mongoose.mongo.ObjectId(userId);
  }
  User.findOneAndUpdate(
    {_id : userId},
    {
      $push: {articles: {$each : req.body.articles } } //$each need if  req.body.articles is an array, else use  $push: {articles: req.body.articles } instead of
    },
    {new: true},
    function(err, savedArticle) {
      if (err) {
        res.send("Error saving article");
      } else {
        res.json(savedArticle);
      }
    }
  );
};
...