mongoose 多个save方法保存如何获取总的保存结果?
操作数据库文件:projectDao.js
var mongoose = require('mongoose')
const Project = mongoose.model('Project')
exports.createProject = async(data) => {
data.m.projectModelId=data.m.projectModel.split(',')[0]
data.m.projectModelName=data.m.projectModel.split(',')[1]
delete data.m.projectModel
let project = new Project(data.m)
let flag1= false
let flag2=false
let flag3=false
await project.save(function (err) {
if (err) {
flag1 = false
return console.error(err)
}else{
flag1=true
return Promise.resolve(flag1)
}
})
console.log(flag1)
let formModels = new ProjectData(data.formModels)
await formModels.save(function (err) {
if (err) {
flag2 = false
return console.error(err)
}else{
return flag2=true
}
})
let tableModels = new ProjectData(data.tableModels)
await tableModels.save(function (err) {
if (err) {
flag3 = false
return console.error(err)
}else{
return flag3=true
}
})
if(flag1&flag2&&flag3){
return true
}
}
controller:
//创建项目api
exports.createProject = async (ctx) => {
const result = projectDao.createProject(ctx.request.body)
ctx.body = {
result
}
}
如上,我想实现同一个方法里有多个save方法,一部分保存在一个表,另一部分保存在别的表,如何同时执行多个保存方法之后获取到总的结果,因为async, await是异步方法,外面获取到的flag的值实际是不变的。
如果三个save是有先后关系的,即第一个save存储成功之后拿到的id存入第二个save中,又该如何写更好?
exports.createProject =(data) => {
data.m.projectModelId=data.m.projectModel.split(',')[0]
data.m.projectModelName=data.m.projectModel.split(',')[1]
delete data.m.projectModel
let project = new Project(data.m)
project.save(function (err, info) {
if (err) {
console.error(err)
} else {
for(let i=0;i<data.formModels.length;i++){
let formModel = new ProjectData({projectId:info._id,projectSubmoduleId:data.formModels[i]._id,createUserId:info.createUserId,createUserName:info.createUserName})
formModel.save(function (err,formData) {
if (err) {
return console.error(err)
}else{
return console.log(formData)
}
})
}
for(let i=0;i<data.tableModels.length;i++){
let tableModel = new ProjectData({projectId:info._id,projectSubmoduleId:data.tableModels[i]._id,createUserId:info.createUserId,createUserName:info.createUserName})
tableModel.save(function (err,tableData) {
if (err) {
return console.error(err)
}else{
return console.log(tableData)
}
})
}
}
})
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
异步流程控制其实是NodeJS的基础知识,跟MongoDB没什么直接联系。你要理解的应该是Promise如何工作。如果你需要上面的保存动作逐一完成,应该使用
Promise.each
。但实际上你的几个操作从上面看起来并没有因果关系,因此应该同时进行更有效率,也就是Promise.all
。你的代码看上去有点奇怪,我想知道
这里的Project是怎么定义的,因为
这里既有
await
又有callback
,两者不应该同时出现。可以试试co,可以
let save1=yield project.save();
这样就能拿到操作后数据的结果了。不是 mongodb 的问题,是 Promise 使用的问题,如果你的3个 save 没有先后关系的话可以用 Promise.all: