NodeJs: TypeError: require (…) nie jest funkcją

86

Próbuję zażądać pliku, a następnie przekazać go do var. Postępuję zgodnie z tym samouczkiem, aby utworzyć system uwierzytelniania. Po zapisaniu pliku server.js i próbie kompilacji pojawił się błąd bson, dlatego zmieniłem wiersz, który wymagał wydania wersji tego pliku w mongoose.

Oto mój kod i błąd:

server.js

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

Błąd

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

Czytałem, że zwykle oznacza to, że requireJS nie ładuje się poprawnie, ale nie wiem, dlaczego i jak to naprawić.

Edytuj w związku z komentarzem:

Zgodnie z pytaniem, oto wynikconsole.log(require);

taigi100
źródło
Czy potrafisz console.log(require)przed linią, która zawodzi? Nie powinieneś potrzebować requireJS po stronie serwera, node.js ma wbudowany system modułów (CommonJS, również używa requirefunkcji). Wydaje się, że coś zmienia requirezmienną globalną .
kraf

Odpowiedzi:

107

Myślę, że oznacza to, że module.exportstwój ./app/routesmoduł nie jest przypisany do funkcji, więc require('./app/routes')nie rozwiązuje się do funkcji, więc nie możesz go nazwać taką funkcją require('./app/routes')(app, passport).

Pokaż nam, ./app/routesjeśli chcesz, abyśmy skomentowali to dalej.

Powinien wyglądać mniej więcej tak;

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

Eksportujesz funkcję, którą można nazwać jak require('./app/routes')(app, passport).


Jednym z innych powodów może wystąpić błąd jest podobny, jeśli masz okrągłą zależność modułu moduł A gdzie próbuje require(B)i moduł B próbuje require(A). Kiedy to się stanie, zostanie to wykryte przez require()podsystem i jeden z nich wróci jako, nulla zatem próba wywołania tego jako funkcja nie zadziała. Rozwiązaniem w tym przypadku jest usunięcie zależności cyklicznej, zwykle przez rozbicie wspólnego kodu na trzeci moduł, który oba mogą oddzielnie ładować, chociaż specyfika ustalania zależności cyklicznej jest unikalna dla każdej sytuacji.

jfriend00
źródło
Lub:module.exports.functionName = function functionName(app, passport) { ... }
Magne
@Magne - Ale OP próbuje zrobić, require('./app/routes')(app, passport);co nie zadziała tak, jak pokazujesz eksport.
jfriend00
To prawda, moja wina. Mój przypadek użycia był nieco inny. Chciałem wyeksportować nazwaną funkcję.
Magne
61

Dla mnie, gdy robię natychmiast wywołaną funkcję, muszę umieścić ;na końcu require().

Błąd:

const fs = require('fs')

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

Dobry:

const fs = require('fs');

(() => {
  console.log('wow')
})()
mCY
źródło
7
To też był mój problem! Problem w rzeczywistości polega na tym, że w tym przypadku środowisko wykonawcze ignoruje białe znaki, więc wydaje się, że przekazujesz treść funkcji () => {}jako argument do tego, co jest zwracane przez require( ... ). Straszny!
Will Brickner
tak, to dobry argument przemawiający za średnikami w debacie „średniki w JS”. Na szczęście brak średników wydaje się być problemem tylko w kontekście wychodzących z mody IIFE
JP Lew
1
O mój Boże!! Przyszedłem puppeteeri prawie poprosiłem o problem, dopóki go nie znalazłem. Uff ... nigdy nie sądziłem, że ;to mnie tak niepokoi.
Irfandy Jip
1
Świetne rozwiązanie! Zauważ, że w rzeczywistości powinieneś umieścić średnik przed każdą funkcją, która sama się wywołuje. Dostosowałem tę konstrukcję:;(() => {})()
Dmitry
Jakie są opcje, jeśli kod znajduje się w bibliotece? Mam bibliotekę node_modules (node-mailjet), która w ogóle nie używa średników. Mogę budować lokalnie z Webpackiem, ale kiedy buduję na Dockerze, pojawia się ten błąd :(
Javier Guzmán
0

U mnie wystąpił podobny błąd podczas przełączania między gałęziami - jedna używana nowsza ("maszynopisowa") wersja @google-cloud/datastorepakietów zwraca obiekt z konstruktorem Datastore jako jedną z właściwości eksportowanego obiektu i przełączyłem się na inną gałąź dla zadania, starszą wersję datastore został tam użyty, który eksportuje konstruktor Datastore „bezpośrednio” jako module.exportswartość. Otrzymałem błąd, ponieważ node_modules nadal miały nowsze moduły używane przez gałąź, z której się przełączyłem.

Kote Isaev
źródło
0

Ja też miałem do czynienia z czymś takim. w pliku tras wyeksportuj funkcję jako obiekt w następujący sposób:

 module.exports = {
     hbd: handlebar
 }

aw pliku aplikacji możesz mieć dostęp do funkcji przez .hbd i nie ma żadnego problemu ....!

HR.Shahhosseini
źródło
-1

Pamiętaj, aby wyeksportować routes.js.

W programie routes.jsnapisz swoje trasy i cały kod w tym module funkcji:

exports = function(app, passport) {

/* write here your code */ 

}
Milani Igor
źródło
-1

Po prostu zawiń funkcję Arrow tam, gdzie potrzebujesz plików

mehmood-zaman
źródło
5
Byłoby miło, gdybyś pokazał nam kod, jak zrobić to, co powiedziałeś
U10-Przekaż