web-dev-qa-db-ja.com

NodeJs:TypeError:require(...)は関数ではありません

ファイルを要求しようとしていますが、その後それを変数に渡します。 this チュートリアルに従って認証システムを作成しています。 server.jsファイルを記述してコンパイルしようとすると、bsonエラーが発生したため、mongooseでそのリリースバージョンを必要とする行を変更しました。

ここに私のコードとエラーがあります:

server.js

    require('./app/routes')(app, passport);

Error

require('./app/routes')(app, passport);
                   ^

TypeError: require(...) is not a function
           at Object.<anonymous> (d:\Node JS learning\WorkWarV2\server.js:38:24)
           at Module._compile (module.js:434:26)
           at Object.Module._extensions..js (module.js:452:10)
           at Module.load (module.js:355:32)
           at Function.Module._load (module.js:310:12)
           at Function.Module.runMain (module.js:475:10)
           at startup (node.js:117:18)
           at node.js:951:3

Process finished with exit code 1

私はこれは通常、requireJSが適切にロードされていないことを意味することを読んでいますが、それを修正する理由や方法はわかりません。

コメントによる編集:

尋ねられたように、 hereconsole.log(require);の結果です

55
taigi100

これは、module.exportsモジュールの./app/routesが関数に割り当てられていないため、require('./app/routes')が関数に解決されないため、このrequire('./app/routes')(app, passport)のような関数として呼び出すことができないことを意味すると思います。

さらにコメントしてほしい場合は、./app/routesを表示してください。

次のようになります。

module.exports = function(app, passport) {
    // code here
}

require('./app/routes')(app, passport)のように呼び出すことができる関数をエクスポートしています。


同様のエラーが発生するもう1つの理由は、モジュールAがrequire(B)を試行し、モジュールBがrequire(A)を試行している循環モジュール依存関係がある場合です。これが発生すると、require()サブシステムによって検出され、そのうちの1つがnullとして返されるため、それを関数として呼び出そうとしても機能しません。その場合の修正は、通常、共通のコードを3つ目のモジュールに分割することにより、循環依存関係を削除することです。

74
jfriend00

私にとって、これは循環依存関係の問題でした。

IOW、モジュールAにはモジュールBが必要、モジュールBにはモジュールAが必要.

したがって、モジュールBでは、require('./A')は関数ではなく空のオブジェクトです。

Node.jsの循環依存関係の処理方法

10
Bryan Larsen

私にとっては、Immediate invoked functionを実行するときに、require()の最後に;を配置する必要があります。

エラー:

const fs = require('fs')

(() => {
  console.log('wow')
})()

良い:

const fs = require('fs');

(() => {
  console.log('wow')
})()
4
mCY