数据库插入数据顺序与预期不一致是什么原因?如何按指定顺序完成插入?
问题根因
你当前的代码里所有异步操作都是并行触发的:async.forEach 本身是非阻塞的,执行完调用语句后不会等待内部回调执行,就会立刻向后执行twoThings、oneThing的插入逻辑,三个异步插入任务互相抢占执行顺序,才会出现插入错乱的问题。
解决方法
用async.series按顺序编排三个任务,保证前一个任务完全执行完成后再启动下一个任务即可,修改后的代码如下:
const async = require('async'); // 确认你已正确引入async模块 var threeThings = JSON.parse(body.threethings); var twoThings = JSON.parse(body.twothings); // 保留你原有random、getdbdate变量的生成逻辑 async.series([ // 任务1:处理并插入threeThings function (cb) { var collectThreeThings = []; async.forEach(threeThings, (item, next) => { var threeThingsList = { uniqueid: random, content: item.content, type: 1, created_at: getdbdate }; collectThreeThings.push(threeThingsList); next(); }, () => { createrecord(models, collectThreeThings, 'sigaram_myreflectioncontentdetails', (res) => { cb(null, 'threeThings 插入完成'); // 当前任务完成,进入下一个任务 }) }) }, // 任务2:处理并插入twoThings function (cb) { var collectTwoThings = []; async.forEach(twoThings, (item, next) => { var twoThingsList = { uniqueid: random, content: item.content, type: 2, created_at: getdbdate }; collectTwoThings.push(twoThingsList); next(); }, () => { createrecord(models, collectTwoThings, 'sigaram_myreflectioncontentdetails', (res) => { cb(null, 'twoThings 插入完成'); }) }) }, // 任务3:插入oneThing function (cb) { var oneThing = { uniqueid: random, content: body.onething, type: 3, created_at: getdbdate }; createrecord(models, oneThing, 'sigaram_myreflectioncontentdetails', (res) => { cb(null, 'oneThing 插入完成'); }) } ], function (err, results) { // 所有任务执行完成后的统一回调,可在此处添加后续逻辑 if (err) { // 自行补充错误处理逻辑 console.error('插入失败:', err); return; } console.log('全部数据按顺序插入完成:', results); })
补充优化点:你用来组装插入数据的
async.forEach没有异步逻辑,完全可以用普通的Array.map替换,减少不必要的异步嵌套,比如threeThings的组装可以直接写成:const collectThreeThings = threeThings.map(item => ({ uniqueid: random, content: item.content, type: 1, created_at: getdbdate }))
内容的提问来源于stack exchange,提问作者Jayanthi
相关产品推荐
相关产品推荐

