首页 > 解决方案 > 使用nodejs在猫鼬中保存嵌套文档时的错误处理

问题描述

我有两个模式,用户和回复。我参考了用户的回复。问题是我必须创建一个回复,然后将其推送到用户的回复数组。如果创建了回复,但由于任何问题找不到用户怎么办!?回复悬而未决,没有附加到任何用户。有什么解决方法吗?

回复架构:

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})
    });
};

标签: node.jsmongooselogic

解决方案


如果没有用户就不能存在回复,首先您必须找到用户。如果不存在,则抛出错误,如果存在,只需创建回复,然后将其附加到找到的用户。

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,您可以使用 Promise 并摆脱那些回调、嵌套句子,我认为它更干净。


推荐阅读