node.js - 使用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})
});
};
解决方案
如果没有用户就不能存在回复,首先您必须找到用户。如果不存在,则抛出错误,如果存在,只需创建回复,然后将其附加到找到的用户。
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 并摆脱那些回调、嵌套句子,我认为它更干净。
推荐阅读
- node.js - 在 Express 服务器上将 Socket.io 切换到 WebSocket 通信时出错
- laravel - 通过 Passport Laravel 在 Adonis JS 中使用生成的令牌
- node.js - 自定义错误响应在用 typescript 编写的 nodejs 中不起作用
- react-native - React-redux 抛出错误:未为 react-native-web 定义导出
- batch-file - 如何批量修复对另一个变量的引用?
- azure - 使用 Azure AD 登录应用程序时,如何在应用程序级别添加徽标、横幅或文本以显示在登录页面上?
- datadog - DataDog 仪表板误报
- python - 使用模型字典列出理解
- javascript - 如何在 Node JS 中使用重定向从 post 路由发送用户数据(如 Id)以获取路由?
- jenkins - Jenkins 声明性管道 - 如果不满足某些条件而不是跳过一个阶段,如何中止整个构建?