Operation database file: 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:
//create project apis
exports.createProject = async (ctx) => {
const result = projectDao.createProject(ctx.request.body)
ctx.body = {
result
}
}
As mentioned above, I want to realize that there are multiple save methods in the same method, one part is saved in one table and the other part is saved in another table. How to obtain the overall result after executing multiple save methods at the same time? Because Async and Await are asynchronous methods, the value of flag obtained outside is actually the same.
If the three save are related in sequence, that is, the id obtained after the first save is successfully saved is saved in the second save, how can it be better written?
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)
}
})
}
}
})
}
Asynchronous process control is actually NodeJS’s basic knowledge and has no direct connection with MongoDB. What you should understand is how Promise works. If you need to save the above actions one by one, you should use
Promise.each
. But in fact, your several operations do not seem to have causal relationship from above, so it should be carried out more efficiently at the same time, that isPromise.all
.
Your code looks a bit strange, I want to knowlet project = new Project(data.m)
How is Project defined here, because
await project.save(function (err) {...}
There are already
await
Another onecallback
, both should not appear at the same time.