Обработка ошибок при сохранении вложенных документов в mongoose с помощью nodejs - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть две схемы, Пользователь и Ответы.Я сослался на ответы пользователей.Проблема в том, что мне нужно создать ответ, а затем отправить его в пользовательский массив ответов.что если ответ создан, а пользователь не найден из-за каких-либо проблем !?ответ висит в воздухе, без привязки к какому-либо пользователю.Есть ли обходной путь?

Схема ответа:

const mongoose = require('mongoose');

const requestReplySchema = mongoose.Schema({
    email: String,
    answers: [
        {
            number: Number,
            title: String,
        }
    ]
}, {timestamps: true});

module.exports = mongoose.model('RequestReply', requestReplySchema);

Схема пользователя (упрощенная версия):

const mongoose = require('mongoose');
const passportLocal = require('passport-local-mongoose');

const userSchema = mongoose.Schema({
    firstName: String,
    lastName: String,
    email: String,
    requestReplies: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'RequestReply'
        }
    ]
}, {timestamps: true});

module.exports = mongoose.model('User', userSchema);

Код NodeJS для этой части:

let postReply = (req, res)=>{

    let replyAnswers = [];

    if(req.body.answers && (req.body.answers).length > 0){
        replyAnswers = req.body.answers;
    } else {
        return res.json({status: false, message: 'answers not properly formed'});
    }

    const newReply = {
        email: req.email,
        answers: replyAnswers,
    };

    RequestReply.create(newReply, (error, createdReply)=>{
        if(error || createdReply === null){
            return res.status(400).json({status: false, message: 'error getting data'})
        }

        User.findOne({email: req.email}, (error, foundUser)=>{
           if(error || foundUser === null){
               // what can I do here!? the request is saved, 
               // but the user is not found or and error happened
           }
        });
        return res.json({status: true})
    });
};

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

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

User.findOne({email: req.email}, (error, foundUser)=>{
    if(error || foundUser === null){
        return res.status(400).json({status: false, message: 'user not found, or   whatever'})
    }
    RequestReply.create(newReply, (error, createdReply)=>{
        if(error || createdReply === null){
            return res.status(400).json({status: false, message: 'error getting data'})
        }
        // TODO Update user with the new reply  
    }
});

В любом случае, с Mongoose вы можете использовать обещания и избавиться от них.обратные вызовы, вложенные предложения, я думаю, что это чище.

0 голосов
/ 21 февраля 2019

Если вы используете набор реплик, вы можете настроить транзакцию (https://mongoosejs.com/docs/transactions.html).. В противном случае я попытаюсь повернуть логику: я получу пользователя, а затем сохраню RequestReply. После создания RequestReply я обновлю пользователя с помощью_id созданного объекта.

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