【问题标题】:Node loop insert with mySQL and Mongodb使用 mySQL 和 Mongodb 插入节点循环
【发布时间】:2018-05-08 23:46:50
【问题描述】:

我有一个包含一个字段的表单,允许用户通过逗号分隔 (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);
    });

【问题讨论】:

    标签: mysql node.js mongodb mongoose nodes


    【解决方案1】:

    您看到这个的原因是因为您的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 中,并在保存完成后解决该问题。

    【讨论】:

    • 您好 AbhinavD,感谢您的建议。我需要一点时间来消化这一点,因为我对 Node 还很陌生。我会让你知道情况如何。干杯!
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2015-01-14
    • 2013-04-05
    相关资源
    最近更新 更多