asyn c стек хуков поврежден - PullRequest
0 голосов
/ 11 марта 2020

Я получаю эту странную ошибку и не смог отследить ее.

Настройка: Узел V8.10.0, expressjs, mongodb

Я не считаю, что это является частью конечных точек API, а скорее импортером скрипт.

Вы можете увидеть ошибку, которую я получаю здесь: https://dpaste.org/zs2S

Это всегда

Ошибка: асин c крючок стек поврежден

Ниже приведен код, который я запускаю. Его целью является использование chokidar для просмотра каталога. (Ранее использовался fs.watch , но изменился на chokidar из-за того, что он думал, что это ошибка fs, но все еще ее получает). А когда файл изменяется, используйте csv2 json, чтобы получить файл и вернуть его как json объект.

Как только этот объект будет извлечен, вставьте его в mon go, сначала добавив его с именем _Update в качестве новой коллекции. Удалите текущий живой, затем переименуйте новый, удалив _Update, и, следовательно, сделайте его живым.

Я использую pm2 для запуска приложения. Он работает какое-то время, но в какой-то момент всегда будет вызывать sh с указанной ошибкой.

//require the mongojs package to setup db connection
var mongojs = require("mongojs");
//require the csvtojson package to convert the CSV file
var csv = require("csvtojson");
require("log-timestamp");
const chokidar = require("chokidar");
var config = 
require("../../config/config").get(process.env.NODE_ENV);
var db = mongojs(config.database);

exports.import = function() {
  // Initialize watcher.
  const watcher = chokidar.watch(config.watchfolder, {
    ignored: /(^|[\/\\])\../, // ignore dotfiles
    persistent: true,
    awaitWriteFinish: true
  });

  // Something to use when events are received.
  const log = console.log.bind(console);

  watcher.on("change", path => {
    log(`File ${path} has been changed`);

    let requiredCollection = config.sources.find(o => o.csvFile === path);

    csv()
      .fromFile(path)
      .then(jsonArrObj => {
        if (requiredCollection.collectionName.includes("RiverLevels")) {
          for (var item in jsonArrObj) {
            if (jsonArrObj[item].Movement == "S") {
              jsonArrObj[item].Movement = "Steady";
            }
            if (jsonArrObj[item].Movement == "R") {
              jsonArrObj[item].Movement = "Rising";
            }
            if (jsonArrObj[item].Movement == "F") {
              jsonArrObj[item].Movement = "Falling";
            }
            if (jsonArrObj[item].PrimaryStation == "1") {
              db.collection("riverOverview").replaceOne(
                { StationName: jsonArrObj[item].StationName },
                jsonArrObj[item]
              );
              console.log("Primary Station updated into riverOverview");
            }
          }
        }

        //Create new collection with _update
        db.createCollection(
          requiredCollection.collectionName + "_Update",
          function(err) {
            //Insert data fulled from file
            db.collection(requiredCollection.collectionName + "_Update").insert(
              jsonArrObj,
              function(err, result) {
                if (err) {
                  console.log(err);
                }
                console.log(
                  requiredCollection.collectionName + "_Update added to mongo"
                );

                //Drop the current DB
                db.collection(requiredCollection.collectionName).drop(function(
                  err
                ) {
                  if (err) {
                    console.log(err);
                  }
                  console.log(
                    "Old " + requiredCollection.collectionName + " deleted."
                  );
                  //rename update DB to make it the live one.
                  db.collection(
                    requiredCollection.collectionName + "_Update"
                  ).rename(requiredCollection.collectionName, function(
                    err,
                    collection
                  ) {
                    if (err) {
                      console.log(err);
                    } else {
                      console.log("rename Results: " + collection.namespace);
                    }
                    console.log(
                      requiredCollection.collectionName +
                        "_Update renamed to: " +
                        requiredCollection.collectionName
                    );
                  });
                });
              }
            );
          }
        );
      });
  });
};

1 Ответ

0 голосов
/ 14 марта 2020

Ваш код требует слишком много времени для разработки, что означает, что несколько запросов заполняют async queue до тех пор, пока он не может его обработать.

Лучший способ действий - обработать исключение, повторив попытку с некоторыми Задержка, используя timeout.

let time = 0; 

try {
    // Do your stuff
    if ( time > 0 ) {
        time -= 1000;
    }
}
catch (e) {
    time += 1000;
    setTimeout(() => {
        // Do your stuff
    }, time);
}

Конечно, это обходной путь. Вам следует попытаться уменьшить количество времени, которое требуется для выполнения действия.

Еще одна вещь: вы используете Node.js 8. Версия 8 вышла из своего окончательного окна обслуживания и больше не поддерживается. Вам следует рассмотреть возможность обновления до версии 12. Обновление до последней версии может также решить проблему asyn c, описанную выше, без использования обходного пути.

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