Вы можете решить эту задачу проще, используя метод 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) ) отправлять данные.
Чтобы иметь возможность анализировать данные 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 } );