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.