Вставка цикла узла с MySQL и Mongodb - PullRequest
0 голосов
/ 09 мая 2018

У меня есть форма с одним полем, которая позволяет пользователю вводить несколько идентификаторов разработчика через запятую (ab1234, bc5678).

После отправки формы я выполняю следующие задачи:

  1. Получить проект
  2. Прокручивать массив идентификаторов разработчиков, чтобы получить их полное имя, используя mySQL
  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);
    });

1 Ответ

0 голосов
/ 09 мая 2018

Причина, по которой вы видите это, заключается в том, что ваш await project.save(); находится внутри функции обратного вызова. Ваша основная функция не будет ожидать завершения всех обратных вызовов и закрытия соединения с БД. Давайте посмотрим на пример ниже

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 печатается перед функциями обратного вызова.

Чтобы решить эту проблему, вы можете заключить функцию обратного вызова в обещание и решить, что после завершения сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...