mon goose Когда я использую update, он обновляется. - PullRequest
0 голосов
/ 06 апреля 2020

Я использую Query for pu sh некоторые данные в массиве в Mongodb, и я использую mon goose в nodeJs. Пожалуйста, кто-нибудь может помочь в этом.

Схема модели:

var mongoose = require('mongoose')
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt')

var schema = new Schema({
    email: { type: String, require: true },
    username: { type: String, require: true },
    password: { type: String, require: true },
    creation_dt: { type: String, require: true },
    tasks : []
});

module.exports = mongoose.model('User',schema)

Итак, я использую эту схему и хочу поместить данные sh в массив задач, и вот мой код маршрута для передачи данных.

Маршрут для обновления данных в задачах:

router.post("/newTask", isValidUser, (req, res) => {
  addToDataBase(req, res);
});

async function addToDataBase(req, res) {
  var dataa = {
    pName: req.body.pName,
    pTitle: req.body.pTitle,
    pStartTime: req.body.pStartTime,
    pEndTime: req.body.pEndTime,
    pSessionTime: req.body.pSessionTime,
  };
  var usr = new User(req.user);
  usr.update({ email: req.user.email }, { $push: { tasks: dataa } });
  console.log(req.user.email);
  try {
    doc = await usr.save();
    return res.status(201).json(doc);
  } catch (err) {
    return res.status(501).json(err);
  }
}

Здесь я создаю асин c функцию и вызываю эту функцию в маршруте, но когда я публикую данные с использованием почтальона, он отвечает код состояния 200 (успех), но он ничего не обновляет в моей базе данных.

Вывод экрана:

Output, как вы можете видеть в этом задании изображения: [] .. в этом массиве ничего не обновляется, но статус - успех. Я не знаю, почему это происходит.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вы можете решить эту задачу проще, используя метод findOneAndUpdate.

router.put("/users", isValidUser, async (req, res) => {
  var data = {
    pName: req.body.pName,
    pTitle: req.body.pTitle,
    pStartTime: req.body.pStartTime,
    pEndTime: req.body.pEndTime,
    pSessionTime: req.body.pSessionTime,
  };

  try {
    const user = await User.findOneAndUpdate(
      { email: req.user.email },
      {
        $push: {
          tasks: data,
        },
      },
      { new: true }
    );

    if (!user) {
      return res.status(404).send("User with email not found");
    }
    res.send(user);
  } catch (err) {
    console.log(err);
    res.status(500).send("Something went wrong");
  }
});

Также я настоятельно рекомендую использовать необработанные данные / JSON для тела запроса, именно так большинство библиотек пользовательского интерфейса (reactjs, angular) ) отправлять данные.

enter image description here

Чтобы иметь возможность анализировать данные json, необходимо добавить следующую строку в основной файл перед использованием маршрутов.

app.use(express.json());

ТЕСТ

Существующий пользователь:

{
    "tasks": [],
    "_id": "5e8b349dc285884b64b6b167",
    "email": "test@gmail.com",
    "username": "Kirtan",
    "password": "123213",
    "creation_dt": "2020-04-06T14:21:40",
    "__v": 0
}

Тело запроса:

{
    "pName": "pName 1",
    "pTitle": "pTitle 1",
    "pStartTime": "pStartTime 1",
    "pEndTime": "pEndTime 1",
    "pSessionTime": "pSessionTime 1"
}

Ответ:

{
    "tasks": [
        {
            "pName": "pName 1",
            "pTitle": "pTitle 1",
            "pStartTime": "pStartTime 1",
            "pEndTime": "pEndTime 1",
            "pSessionTime": "pSessionTime 1"
        }
    ],
    "_id": "5e8b349dc285884b64b6b167",
    "email": "test@gmail.com",
    "username": "Kirtan",
    "password": "123213",
    "creation_dt": "2020-04-06T14:21:40",
    "__v": 0
}

Также в качестве примечания вам лучше создать уникальные индексы для полей имени пользователя и электронной почты. Это можно сделать, применив в схеме параметр unique: true, но лучше создать эти уникальные индексы в оболочке mongodb следующим образом:

db.users.createIndex( { "email": 1 }, { unique: true } );
db.users.createIndex( { "username": 1 }, { unique: true } );
1 голос
/ 06 апреля 2020

Прошло некоторое время с тех пор, как я выполнил пн goose, но я уверен, что <model>.update() также активно обновляет запись в пн go.

Вы используете .update(), когда хотите обновить существующую запись в Mon go, но вы создаете новую модель User (т.е. создаете нового пользователя)

, попробуйте следующий код вместо НОВОГО ПОЛЬЗОВАТЕЛЯ:


router.post('/newTask', isValidUser, (req, res) => {

  addToDataBase(req,res)

})
async function addToDataBase(req, res) {

  var dataa = {
    pName: req.body.pName,
    pTitle: req.body.pTitle,
    pStartTime: req.body.pStartTime,
    pEndTime: req.body.pEndTime,
    pSessionTime: req.body.pSessionTime
  }

  // email field is already in `req.user` 
  var usr = new User({ ...req.user, tasks: [dataa] });

  console.log(req.user.email);
  try {
    await usr.save();
    return res.status(201).json(doc);
  }
  catch (err) {
    return res.status(501).json(err);
  }

}

Теперь, если вы хотите обновить существующую запись:


router.post('/newTask', isValidUser, (req, res) => {

  addToDataBase(req,res)

})
async function addToDataBase(req, res) {

  var dataa = {
    pName: req.body.pName,
    pTitle: req.body.pTitle,
    pStartTime: req.body.pStartTime,
    pEndTime: req.body.pEndTime,
    pSessionTime: req.body.pSessionTime
  }


  try {
    await usr. updateOne({ email : req.user.email}, { $push: { tasks: dataa } });
    return res.status(201).json(doc);
  }
  catch (err) {
    return res.status(501).json(err);
  }

}

Для получения дополнительной информации читайте: https://mongoosejs.com/docs/documents.html

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