NodeJs: TypeError: require (…) ist keine Funktion

86

Ich versuche, eine Datei zu benötigen und sie anschließend an eine Variable zu übergeben. Ich folge diesem Tutorial, um ein Authentifizierungssystem zu erstellen. Nachdem ich die Datei server.js geschrieben und versucht hatte zu kompilieren, wurde ein bson-Fehler angezeigt. Daher habe ich die Zeile geändert, für die die Release-Version in mongoose erforderlich war.

Hier sind mein Code und mein Fehler:

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

Ich habe gelesen, dass dies normalerweise bedeutet, dass requireJS nicht richtig geladen wird, aber ich weiß nicht, warum oder wie ich es beheben soll.

Aufgrund eines Kommentars bearbeiten:

Wie gefragt, hier ist das Ergebnis vonconsole.log(require);

taigi100
quelle
Können Sie console.log(require)vor der Leitung, die ausfällt? Sie sollten auf der Serverseite kein requireJS benötigen. In node.js ist ein Modulsystem integriert (CommonJS verwendet ebenfalls die requireFunktion). Etwas scheint die globale requireVariable zu verändern.
Kraf

Antworten:

107

Ich denke, dies bedeutet, dass module.exportsin Ihrem ./app/routesModul keine Funktion zugewiesen ist und daher require('./app/routes')nicht in eine Funktion aufgelöst wird. Daher können Sie sie nicht als solche Funktion aufrufen require('./app/routes')(app, passport).

Zeigen Sie uns, ./app/routesob wir dies weiter kommentieren sollen.

Es sollte ungefähr so ​​aussehen;

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

Sie exportieren eine Funktion, die dann wie aufgerufen werden kann require('./app/routes')(app, passport).


Ein weiterer Grund, warum ein ähnlicher Fehler auftreten kann, besteht darin, dass Sie eine zirkuläre Modulabhängigkeit haben, in der Modul A require(B)und Modul B dies versuchen require(A). Wenn dies geschieht, wird es vom require()Subsystem erkannt und einer von ihnen kommt als zurück nullund der Versuch, dies als Funktion aufzurufen, funktioniert nicht. In diesem Fall besteht die Lösung darin, die zirkuläre Abhängigkeit zu entfernen, indem normalerweise gemeinsamer Code in ein drittes Modul aufgeteilt wird, das beide separat laden können, obwohl die Besonderheiten des Fixierens einer zirkulären Abhängigkeit für jede Situation eindeutig sind.

jfriend00
quelle
Oder:module.exports.functionName = function functionName(app, passport) { ... }
Magne
@Magne - Aber das OP versucht dies zu tun, require('./app/routes')(app, passport);was nicht so funktioniert, wie Sie den Export anzeigen .
jfriend00
Stimmt, mein schlechtes. Mein Anwendungsfall war etwas anders. Ich wollte eine benannte Funktion exportieren.
Magne
61

Für mich, wenn ich sofort aufgerufene Funktion mache, muss ich ;am Ende setzen require().

Error:

const fs = require('fs')

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

Gut:

const fs = require('fs');

(() => {
  console.log('wow')
})()
mCY
quelle
7
Das war auch mein Problem! Das Problem ist wirklich, dass die Laufzeit in diesem Fall Leerzeichen ignoriert, und es scheint, dass Sie Ihren Funktionskörper () => {}als Argument an alles übergeben, was von zurückgegeben wird require( ... ). Furchtbar!
Will Brickner
Ja, dies ist ein gutes Argument für Semikolons in der Debatte "Semikolons in JS". Glücklicherweise scheint das Fehlen von Semikolons nur im Zusammenhang mit IIFEs problematisch zu sein, die aus der Mode kommen
JP Lew
1
Ach du lieber Gott!! Ich kam von puppeteerund hätte dort fast ein Problem angefordert, bis ich hier eines gefunden habe. Puh ... hätte nie gedacht, dass ;mich das so sehr beunruhigen würde.
Irfandy Jip
1
Tolle Lösung! Beachten Sie, dass Sie das Semikolon vor jeder selbstaufrufenden Funktion einfügen sollten. Ich habe diese Konstruktion angepasst:;(() => {})()
Dmitry
Welche Optionen gibt es, wenn sich der Code in einer Bibliothek befindet? Ich habe eine node_modules-Bibliothek (node-mailjet), die überhaupt keine Semikolons verwendet. Ich kann mit Webpack ok lokal bauen, aber wenn ich auf Docker baue, wird folgende Fehlermeldung angezeigt :(
Javier Guzmán
12

Für mich war dies ein Problem mit zyklischen Abhängigkeiten.

IOW, Modul A erforderliches Modul B und Modul B erforderliches Modul A.

Also ist in Modul B require('./A')eher ein leeres Objekt als eine Funktion.

Umgang mit zyklischen Abhängigkeiten in Node.js.

Bryan Larsen
quelle
0

Beim Umschalten zwischen Zweigen trat für mich ein ähnlicher Fehler auf - eine verwendete neuere ("typescriptish") Version von @google-cloud/datastorePaketen, die ein Objekt mit dem Datenspeicherkonstruktor als eine der Eigenschaften des exportierten Objekts zurückgibt, und ich wechselte für eine Aufgabe zu einem anderen Zweig, einer älteren Datenspeicherversion wurde dort verwendet, der den Datenspeicherkonstruktor "direkt" als module.exportsWert exportiert . Ich habe den Fehler erhalten, weil node_modules noch neuere Module hatte, die von dem Zweig verwendet wurden, von dem ich gewechselt habe.

Kote Isaev
quelle
0

Ich habe mich auch so etwas gestellt. Exportieren Sie die Funktion in Ihrer Routendatei als Objekt wie folgt:

 module.exports = {
     hbd: handlebar
 }

und in Ihrer App-Datei können Sie über .hbd auf die Funktion zugreifen, und es gibt kein Problem ....!

HR.Shahhosseini
quelle
-1

Denken Sie daran, Ihre zu exportieren routes.js.

In routes.js, schreiben Sie Ihre Routen und den gesamten Code in diesem Funktionsbaustein:

exports = function(app, passport) {

/* write here your code */ 

}
Milani Igor
quelle
-1

Schließen Sie einfach die Pfeilfunktion dort ein, wo Sie die Dateien benötigen

Mehmood-Zaman
quelle
5
Wäre schön, wenn Sie uns einen Code zeigen würden, wie Sie das tun, was Sie gesagt haben
U10-Forward