Исправить экспорт функции async в node.js

У меня был свой собственный модуль со следующим кодом:

module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}

Он работал нормально, если вызывать функцию вне моего модуля, однако, если я вызвал внутри, во время работы я получил ошибку:

(node: 24372) UnhandledPromiseRejectionWarning: Отказ от необработанного обещания (идентификатор отклонения: 1): ReferenceError: PrintNearestStore не определен

Когда я изменил синтаксис на:

module.exports.PrintNearestStore = PrintNearestStore;

var PrintNearestStore = async function(session, lat, lon) {

}

Он начал нормально работать внутри модуля, но выходит за пределы модуля - у меня ошибка:

(node: 32422) UnhandledPromiseRejectionWarning: Отказ от необработанного обещания (идентификатор отклонения: 1): TypeError: mymodule.PrintNearestStore не является функцией

Поэтому я изменил код на:

module.exports.PrintNearestStore = async function(session, lat, lon) {
    await PrintNearestStore(session, lat, lon);
}

var PrintNearestStore = async function(session, lat, lon) {
...
}

И теперь он работает во всех случаях: внутри и снаружи. Однако хотите понять семантику и если есть более красивый и более короткий способ написать это? Как правильно определить и использовать функцию async как внутри, так и снаружи (экспорт) модуля?

Ответ 1

Это не имеет ничего общего с функциями async. Если вы хотите вызвать функцию внутри и экспортировать ее, сначала определите ее, а затем экспортируйте.

async function doStuff() {
  // ...
}
// doStuff is defined inside the module so we can call it wherever we want

// Export it to make it available outside
module.exports.doStuff = doStuff;

Объяснение проблем с вашими попытками:

module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}

Это не определяет функцию в модуле. Определение функции - это выражение функции. Имя выражения функции создает только переменную внутри самой функции. Простой пример:

var foo = function bar() {
  console.log(typeof bar); // 'function' - works
};
foo();
console.log(typeof foo); // 'function' - works
console.log(typeof bar); // 'undefined' - there is no such variable 'bar'

Ответ 2

Ошибка с первым случаем: PrintNearestStore - выражение функции, поэтому это имя недоступно снаружи.

ошибка со вторым случаем: использование переменной, вместо объявления функции. В этом случае объявление переменной PrintNearestStore поднимается, поэтому вы можете использовать это имя до строки var PrintNearestStore =..., но в этом случае значение будет неопределенным.

Итак, простейшее решение меняет второй вариант:

module.exports.PrintNearestStore = PrintNearestStore;

async function PrintNearestStore(session, lat, lon) {

}