узел csv файлы загружают синхронный импорт с последующим поиском в мангусте - PullRequest
0 голосов
/ 22 февраля 2019

Я не могу получить результаты запроса поиска mongoose после успешной загрузки CSV-файлов.Данные из csvs сохраняются в моей коллекции ОК.Но я не получаю результатов от следующего запроса поиска.Что вызывает обещания не соответствовать последовательности?Я чувствую, что могу быть близок к пониманию обещаний, поскольку они обрабатываются в цикле событий, но этот случай ускользает от меня?

let uploadfiles = function (req,res) {
 return new Promise( function (resolve, reject) {
    upload(req, res, (err) => {
        promises = [];
        if (!err) {
            if (Object.keys(req.files).length>0) {

                simpleLoop(req.files, function (value, key, lovey) {
                    promises.push(insertStreamData(req.files[key]["originalname"]));
                });

                      console.log('hither');


            }
        }
              return Promise.all(promises);

    });
    resolve('something');
     });
   };



// insert uploaded csv data from files into db 
function insertStreamData(filename){
    var originalFileName = filename;
    var thefilename = originalFileName.split('.');
    var csvfile = "./public/files/"+originalFileName;
    var stream = fs.createReadStream(csvfile, { headers: true});

    var csvStream = csv().on("data", function(data){

        if(data[0] != 'Product #' && data[7] != 0){
            var item = new Product({
                'Invoice':thefilename[0],
                'Product #': data[0],
                'SKU': data[1],
                'UpcCode': data[2],
                'Description': data[3],
                'MfgNo': data[4],
                'Vendor': data[5],
                'Order Qty': data[6],
                'Ship Qty': data[7],
                'Min Sell': data[8],
                'Retail': data[9],
                'Cost': data[10],
                'Ext Cost': data[11],
                'Box': data[12]

            });


            item.save(function(error){ if(error){ throw error; } });

        }
    }).on("end", function(){
        console.log('the end');
    });
    stream.pipe(csvStream);
}






let getincomingproducts =  function(){
 return new Promise(function (resolve, reject) {

 resolve('done');


 });
};

router.post('/uploaddata', function(req, res) {


    uploadfiles(req,res).then(function(result){
      return getincomingproducts();
    }).then(function(result){
      console.log(result);
      res.redirect('/showdata');

    }).catch(err => console.log("Caught " + err));





});

Вывод 'done' регистрируется на консоли перед первым обещанием.Я хочу заменить сделано с мангуста найти результаты.Но простой консольный журнал демонстрирует несинхронный результат.

done
hither
the end
the end
the end
the end

1 Ответ

0 голосов
/ 22 февраля 2019

Пожалуйста, не смешивайте конструкторы Promise и другие с async и await.Это может быть намного проще, если вы просто используете функции await и async.И только один раз оберните функции, принимающие вызовы.

Чистая версия не будет иметь никакой бизнес-логики в конструкторах Promise и будет использовать await, а не асинхронную функцию.

Я нашелВторой пункт в программе, где он не ожидает завершения действия, заключается в том, что insertStreamData не возвращает обещание, которое выполняется, когда оно выполнено, что и является причиной проблемы с порядком.Я обновлю свой ответ.

Я вижу проблему в загружаемых файлах, где она имеет:

return Promise.all(promises);

    });
    resolve('something');

, которая должна быть

return Promise.all(promises).then(function () {
  resolve('something');
});

Это изменение должно вызвать выводбыть hither, the end * 4, done.Если вы хотите, чтобы insertStreamData происходил последовательно, а не параллельно, это требует другого изменения.


Моя версия скрипта:

function upload_wrapper(req, res) {
  return new Promise(function(resolve, reject) {
    upload(req, res, function (err) {
      if (err) {
        reject(err);
      } else {
        resolve();
      }
    });
  })
}


let uploadfiles = async function(req, res) {
  await upload_wrapper(req, res);
  let promises = [];
  if (Object.keys(req.files).length > 0) {
    simpleLoop(req.files, function(value, key, lovey) {
      promises.push(insertStreamData(req.files[key]["originalname"]));
    });
    console.log('hither');
  }
  await Promise.all(promises);
  return 'something';
};


// insert uploaded csv data from files into db 
function insertStreamData(filename) {
  return new Promise(function(resolve, reject) {

    var originalFileName = filename;
    var thefilename = originalFileName.split('.');
    var csvfile = "./public/files/" + originalFileName;
    var stream = fs.createReadStream(csvfile, {
      headers: true
    });
    var csvStream = csv();

    csvStream.on("data", function(data) {

      if (data[0] != 'Product #' && data[7] != 0) {
        var item = new Product({
          'Invoice': thefilename[0],
          'Product #': data[0],
          'SKU': data[1],
          'UpcCode': data[2],
          'Description': data[3],
          'MfgNo': data[4],
          'Vendor': data[5],
          'Order Qty': data[6],
          'Ship Qty': data[7],
          'Min Sell': data[8],
          'Retail': data[9],
          'Cost': data[10],
          'Ext Cost': data[11],
          'Box': data[12]
        });

        item.save(function(error) {
          if (error) {
            //throw error;
            csvStream.pause(); // here the stream should be destroyed if this stops at the first error
            reject(error);
          }
        });
      }
    }).on("end", function() {
      console.log('the end');
      resolve('the end');
    });
    stream.pipe(csvStream);

  });
}

let getincomingproducts = function() {
  return Promise.resolve('done');
};

router.post('/uploaddata', async function(req, res) {

  try {
    let result = await uploadfiles(req, res);
    let result = await getincomingproducts();
    console.log(result);
    res.redirect('/showdata');
  } catch (err) {
    console.log("Caught " + err)
  }

});

Не проверено.Это все еще может быть улучшено.

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