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);


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.


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')
})()

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.


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 ....!


-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 */ 

}

-1

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


5
Byłoby miło, gdybyś pokazał nam kod, jak zrobić to, co powiedziałeś
U10-Przekaż
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.