1. ホーム
  2. javascript

[解決済み] node.jsの非同期関数エクスポートの修正

2022-02-09 12:43:20

質問

以下のコードでカスタムモジュールを作成しました。

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

モジュールの外側で関数を呼び出すとうまくいくのですが、内側で呼び出すと実行中にエラーが発生します。

(node:24372) UnhandledPromiseRejectionWarning: 未処理の約束 拒否されました (拒否 ID: 1)。ReferenceError: PrintNearestStoreは 定義

という構文に変更したところ。

module.exports.PrintNearestStore = PrintNearestStore;

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

}

モジュール内では正常に動作し始めましたが、モジュール外ではエラーが出て失敗しました。

(node:32422) UnhandledPromiseRejectionWarning。処理されない約束 拒否されました (拒否 ID: 1)。TypeError: mymodule.PrintNearestStore is 関数ではない

ということで、コードを変更しました。

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

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

これで、内側と外側のすべてのケースで動作するようになりました。しかし、セマンティクスを理解し、より美しく、より短い書き方があるのでしょうか?を正しく定義して使うにはどうしたらいいでしょうか? 非同期 関数は、モジュールの内側と外側(exports)の両方にあるのですか?

どのように解決するのですか?

これは、特に非同期関数とは関係ないんです。内部で関数を呼び出したい場合 をエクスポートするには、それを定義します。 まず を作成し、それをエクスポートします。

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`

こちらもご覧ください 名前付き関数式の謎解き . を参照するのであれば、もちろんその関数を参照することができます。 module.exports.PrintNearestStore をいたるところで見ることができます。


module.exports.PrintNearestStore = PrintNearestStore;

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

}

これは ほとんど OKです。問題は、その値が PrintNearestStoreundefined に代入すると module.exports.PrintNearestStore . 実行の順番は

var PrintNearestStore; // `undefined` by default
// still `undefined`, hence `module.exports.PrintNearestStore` is `undefined`
module.exports.PrintNearestStore = PrintNearestStore;

PrintNearestStore = async function(session, lat, lon) {}
// now has a function as value, but it's too late

よりシンプルな例です。

var foo = bar;
console.log(foo, bar); // logs `undefined`, `undefined` because `bar` is `undefined`
var bar = 21;
console.log(foo, bar); // logs `undefined`, `21`

順番を変えれば期待通りに動くはずです。


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

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

これは、以下の理由で動作します。 それまでに に割り当てられた関数は module.exports.PrintNearestStore が実行されます。 , PrintNearestStore は、この関数を値として持っています。

もっと簡単な例です。

var foo = function() {
  console.log(bar);
};
foo(); // logs `undefined`
var bar = 21;
foo(); // logs `21`