mongoose 多个save方法保存如何获取总的保存结果?

发布于 2022-09-07 11:32:11 字数 2995 浏览 32 评论 0

操作数据库文件: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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

待天淡蓝洁白时 2022-09-14 11:32:11

异步流程控制其实是NodeJS的基础知识,跟MongoDB没什么直接联系。你要理解的应该是Promise如何工作。如果你需要上面的保存动作逐一完成,应该使用Promise.each。但实际上你的几个操作从上面看起来并没有因果关系,因此应该同时进行更有效率,也就是Promise.all
你的代码看上去有点奇怪,我想知道

let project = new Project(data.m)

这里的Project是怎么定义的,因为

await project.save(function (err) {...}

这里既有await又有callback,两者不应该同时出现。

べ繥欢鉨o。 2022-09-14 11:32:11

可以试试co,可以let save1=yield project.save();这样就能拿到操作后数据的结果了。

辞取 2022-09-14 11:32:11

不是 mongodb 的问题,是 Promise 使用的问题,如果你的3个 save 没有先后关系的话可以用 Promise.all:

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
    const p1 =  new Project(data.m).save()
    const p1 =  new ProjectData(data.formModels).save()
    const p1 =  new ProjectData(data.tableModels).save()
    try {
        await Promise.all([p1, p1, p3])
        console.log('save success')
    } catch (e) {
        console.log('save failed')
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文