NodeJs: TypeError: require (…) non è una funzione


88

Sto cercando di richiedere un file e successivamente di passarlo a un var. Sto seguendo questo tutorial per creare un sistema di autenticazione. Dopo aver scritto il file server.js e provato a compilare ho ricevuto un errore bson, quindi ho cambiato la riga che richiedeva la versione di rilascio di esso in mangusta.

Ecco il mio codice e l'errore:

server.js

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

Errore

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

Ho letto che questo di solito significa che requireJS non viene caricato correttamente, ma non so perché o come risolverlo.

Modifica a causa del commento:

Come chiesto, ecco il risultato diconsole.log(require);


Puoi console.log(require)prima che la linea fallisca? Non dovresti aver bisogno di requireJS sul lato server, node.js ha un sistema di moduli integrato (CommonJS, usa anche la requirefunzione). Qualcosa sembra stia cambiando la requirevariabile globale .
kraf

Risposte:


107

Penso che questo significhi che module.exportsnel tuo ./app/routesmodulo non è assegnata una funzione, quindi require('./app/routes')non si risolve in una funzione, quindi non puoi chiamarlo come una funzione come questa require('./app/routes')(app, passport).

Mostraci ./app/routesse vuoi che commentiamo ulteriormente in merito.

Dovrebbe assomigliare a qualcosa di simile a questo;

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

Stai esportando una funzione che può essere chiamata come require('./app/routes')(app, passport).


Un altro motivo potrebbe verificarsi un errore simile è se si dispone di una dipendenza del modulo circolare dove modulo A sta cercando di require(B)e modulo B sta cercando di require(A). Quando ciò accade, verrà rilevato dal require()sottosistema e uno di loro tornerà come nulle quindi provare a chiamarlo come funzione non funzionerà. La soluzione in questo caso è rimuovere la dipendenza circolare, di solito suddividendo il codice comune in un terzo modulo che entrambi possono essere caricati separatamente sebbene le specifiche di correzione di una dipendenza circolare siano uniche per ogni situazione.


Oppure:module.exports.functionName = function functionName(app, passport) { ... }
Magne

@Magne - Ma l'OP sta cercando di fare il require('./app/routes')(app, passport);che non funzionerà nel modo in cui mostri l'esportazione.
jfriend00

Vero, colpa mia. Il mio caso d'uso era leggermente diverso. Volevo esportare una funzione con nome.
Magne

67

Per me, quando eseguo la funzione Immediatamente invocata, devo mettere ;alla fine di require().

Errore:

const fs = require('fs')

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

Buona:

const fs = require('fs');

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

7
Questo era anche il mio problema! Il problema è che in questo caso il runtime ignora gli spazi bianchi, quindi sembra che tu stia passando il corpo della funzione () => {}come argomento a qualsiasi cosa venga restituita da require( ... ). Terribile!
Will Brickner

sì, questo è un buon argomento a favore del punto e virgola nel dibattito "punto e virgola in JS". Fortunatamente, l'assenza del punto e virgola sembra essere un problema solo nel contesto degli IIFE, che stanno cadendo di moda
JP Lew

1
Dio mio!! Vengo da dove ho puppeteerquasi chiesto un problema finché non ne ho trovato uno qui. Uff ... non ;avrei mai pensato che mi avrebbe disturbato così tanto.
Irfandy Jip

1
Ottima soluzione! Nota che in realtà dovresti mettere il punto e virgola prima di ogni funzione di auto invocazione. Ho adattato questa costruzione:;(() => {})()
Dmitry

Quali sono le opzioni se il codice è all'interno di una libreria? Ho una libreria node_modules (node-mailjet) che non usa affatto il punto e virgola. Posso costruire con Webpack a livello locale, ma quando compilo su Docker viene visualizzato questo errore :(
Javier Guzmán


0

Per me, ho ricevuto un errore simile quando sono passato da un ramo all'altro: una versione dei @google-cloud/datastorepacchetti più recente ("typescriptish") che restituisce l'oggetto con il costruttore Datastore come una delle proprietà dell'oggetto esportato e sono passato a un altro ramo per un'attività, una versione del datastore precedente è stato utilizzato lì, che esporta il costruttore Datastore "direttamente" come module.exportsvalore. Ho ricevuto l'errore perché node_modules aveva ancora moduli più recenti utilizzati dal ramo da cui sono passato.


0

Anch'io ho dovuto affrontare qualcosa di simile. nel file dei percorsi, esporta la funzione come un oggetto come questo:

 module.exports = {
     hbd: handlebar
 }

e nel file della tua app puoi avere accesso alla funzione tramite .hbd e non c'è nessun ptoblem ....!


-1

Ricordati di esportare il tuo file routes.js.

In routes.js, scrivi le tue rotte e tutto il tuo codice in questo modulo funzione:

exports = function(app, passport) {

/* write here your code */ 

}

-1

Basta inserire la funzione Freccia in cui si richiedono i file


5
Sarebbe bello se ci mostrassi un codice su come fare ciò che hai detto
U11-Forward
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.