使用 mySQL 和 Mongodb 的节点循环插入



我有一个带有一个字段的表单,允许用户通过逗号分隔(ab1234,bc5678(输入多个开发人员ID。

提交表格后,我将执行以下任务:

  1. 获取项目
  2. 使用 mySQL 遍历开发人员 ID 数组以获取其全名
  3. 使用 MongoDB 更新项目

我是新手,确定这是可能的,我在下面的代码对我不起作用。有人可以让我知道下面的代码是否接近。

const mongoose = require('mongoose'
const mysql = require('mysql');
// Create mySQL connection
const mySQLdb = mysql.createConnection({
host     : 'localhost',
user     : 'root',
password : 'root',
database : 'projects'
});
const Project = mongoose.model('project');
router.post('/developerSave', async (req, res) => {
let devList = req.body.dev_ids,
devIdArr = devList.split(','),
rData = {};
// get project
const project = await Project.findById(req.body.projectID);
mySQLdb.connect();
for(var i=0, len=devIdArr.length; i < len; i++) {      
let sql = `SELECT CONCAT(first_name, ' ', last_name) as full_name FROM users WHERE id= '${devIdArr[i]}'`;
mySQLdb.query(sql, function (err, results) {
if (err) throw err;    
let newDev = {
userId: devIdArr[i],
fullName: results[0].full_name
}
project.developers.unshift(newDev);
await project.save();
});
}
mySQLdb.end();
rData.success = true;
rData.msg = 'Developer was added successfully.';
res.status(200).json(rData);
});

你看到这个的原因是因为你的await project.save();在回调函数内。您的 main 函数不会等待所有回调完成并关闭数据库连接。让我们看下面的例子

const myCallback = (param, callback) => {
setTimeout(() => {
console.log('callback function', param);
callback();
}, 1000)
}
const myAsync = async () => {
console.log('inside async');
const result = await axios.get('http://google.com/');
for (let i = 0; i < 10; i++) {
myCallback(i, () => {
console.log('this is the actual callback function');
});
}
const result2 = await axios.get('http://bing.com/');
console.log('after second call');
}
myAsync();

其输出为

inside async
after second call
callback function 0
this is the actual callback function
...

如您所见,after second call是在回调函数之前打印的。

要解决此问题,您可以将回调函数包装在 promise 中,并在保存完成后解决此问题。

最新更新