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


88

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

これが私のコードとエラーです:

server.js

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

エラー

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が正しくロードされていないことを意味しますが、それを修正する理由や方法がわかりません。

コメントによる編集:

尋ねたとして、ここでの結果であり、console.log(require);


console.log(require)失敗する行の前にできますか?サーバー側でrequireJSは必要ありません。node.jsにはモジュールシステムが組み込まれています(CommonJS、require関数も使用します)。何かがグローバルrequire変数を変更しているようです。
kraf 2015年

回答:


107

これは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番目のモジュールに分割し、両方を別々にロードできます。


または:module.exports.functionName = function functionName(app, passport) { ... }
マグネ

@ Magne-しかし、OPはrequire('./app/routes')(app, passport);、エクスポートを表示する方法では機能しないようにしようとしています。
jfriend 0020年

確かに、私の悪い。私のユースケースは少し異なっていました。名前付き関数をエクスポートしたかったのです。
マグネ

67

私にとって、即時呼び出し関数を実行するとき;は、の最後に置く必要がありrequire()ます。

エラー:

const fs = require('fs')

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

良い:

const fs = require('fs');

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

7
これも私の問題でした!問題は、この場合、ランタイムが空白を無視することです。そのため、() => {}によって返されるものすべてに引数として関数本体を渡しているようですrequire( ... )。ひどい!
WillBrickner19年

ええ、これは「JSのセミコロン」の議論でセミコロンを支持する良い議論です。幸いなことに、セミコロンがないことが唯一のファッションのうち下落しているIIFEsの文脈で問題になるようだ
JPルー

1
何てことだ!!私はここから来てpuppeteer、ここで問題を見つけるまで、ほとんど問題を要求しました。ふぅ...;そんなに困るとは思わなかった。
IrfandyJip20年

1
素晴らしい解決策!実際には、すべての自己呼び出し関数の前にセミコロンを付ける必要があることに注意してください。私はこの構造を採用しました:;(() => {})()
ドミトリー

コードがライブラリ内にある場合のオプションは何ですか?セミコロンをまったく使用しないnode_modulesライブラリ(node-mailjet)があります。私は、ローカルのWebPACKの[OK]をクリックして構築することができますが、私はドッカー上に構築するとき、それは、このエラー:(取得
ハビエル・グスマン


0

私の場合、ブランチを切り替えると同様のエラーが発生しました。@google-cloud/datastoreエクスポートされたオブジェクトのプロパティの1つとしてデータストアコンストラクターを含むオブジェクトを返す新しい(「typescriptish」)バージョンのパッケージを使用し、タスクのために別のブランチ、古いデータストアバージョンに切り替えました。そこで使用され、データストアコンストラクターをmodule.exports値として「直接」エクスポートします。node_modulesには、切り替え元のブランチで使用される新しいモジュールがまだあるため、エラーが発生しました。


0

私もこのようなことに直面しました。ルートファイルで、関数を次のようなオブジェクトとしてエクスポートします。

 module.exports = {
     hbd: handlebar
 }

また、アプリファイルでは、.hbdで関数にアクセスでき、問題はありません....!


-1

をエクスポートすることを忘れないでくださいroutes.js

routes.js、この汎用モジュールにルートとすべてのコードを記述します。

exports = function(app, passport) {

/* write here your code */ 

}

-1

ファイルが必要な場所でArrow関数をラップするだけです


5
あなたは私たちにあなたが言ったことを実行する方法のいくつかのコードを表示したい場合はいいだろう
U11-フォワード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.