NodeJs: TypeError: require (…) не является функцией


86

Я пытаюсь потребовать файл, а затем передать его в var. Я следую этому руководству по созданию системы аутентификации. После написания файла server.js и попытки скомпилировать у меня возникла ошибка bson, поэтому я изменил строку, которая требовала его релизную версию в mongoose.

Вот мой код и ошибка:

server.js

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

ошибка

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

Я читал, что это обычно означает, что requireJS не загружается должным образом, но я не знаю, почему и как это исправить.

Редактировать из-за комментария:

Как и просили, вот результатconsole.log(require);


Можете ли вы console.log(require)перед ошибкой линии? На стороне сервера не требуется requireJS, в node.js встроена модульная система (CommonJS также использует requireфункцию). Кажется, что-то меняет глобальную requireпеременную.
kraf

Ответы:


107

Я думаю, это означает, что module.exportsв вашем ./app/routesмодуле не назначена функция, поэтому require('./app/routes')он не разрешается в функцию, поэтому вы не можете вызывать его как функцию, подобную этой require('./app/routes')(app, passport).

Покажите нам, ./app/routesесли вы хотите, чтобы мы прокомментировали это дальше.

Это должно выглядеть примерно так:

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

Вы экспортируете функцию, которую затем можно вызвать как require('./app/routes')(app, passport).


Еще одна причина, по которой может возникнуть аналогичная ошибка, заключается в том, что у вас есть циклическая зависимость модуля, когда модуль A пытается, require(B)а модуль B пытается require(A). Когда это произойдет, это будет обнаружено require()подсистемой, и одна из них вернется как nullи, таким образом, попытка вызвать это как функцию не будет работать. Исправление в этом случае состоит в том, чтобы удалить циклическую зависимость, обычно путем разбивки общего кода на третий модуль, который оба могут загружаться отдельно, хотя особенности исправления циклической зависимости уникальны для каждой ситуации.


Или:module.exports.functionName = function functionName(app, passport) { ... }
Магне

@Magne - Но OP пытается сделать, require('./app/routes')(app, passport);что не будет работать так, как вы показываете экспорт.
jfriend00

Правда моя плохая. Мой вариант использования был немного другим. Я хотел экспортировать именованную функцию.
Магне

61

Для меня, когда я выполняю функцию с немедленным вызовом, мне нужно поставить ;в конце require().

Ошибка:

const fs = require('fs')

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

Хороший:

const fs = require('fs');

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

7
Это тоже была моя проблема! Проблема в том, что в этом случае среда выполнения игнорирует пробелы, и поэтому кажется, что вы передаете тело функции () => {}в качестве аргумента тому, что возвращает require( ... ). Ужасно!
Уилл Брикнер

да, это хороший аргумент в пользу точки с запятой в дебатах о «точках с запятой в JS». К счастью, отсутствие точек с запятой кажется проблемой только в контексте IIFE, которые выходят из моды
JP Lew

1
Боже мой!! Я приехал puppeteerи почти запросил там проблему, пока не нашел ее здесь. Уф ... никогда не думал, что ;это меня так сильно беспокоит.
Ирфанди Джип,

1
Отличное решение! Обратите внимание, что на самом деле вы должны ставить точку с запятой перед каждой самозапускающейся функцией. Я адаптировал эту конструкцию:;(() => {})()
Дмитрий

Какие есть варианты, если код находится в библиотеке? У меня есть библиотека node_modules (node-mailjet), которая вообще не использует точки с запятой. Я могу собрать Webpack локально, но когда я использую Docker, он получает эту ошибку :(
Хавьер Гусман


0

У меня аналогичная ошибка возникла при переключении между ветвями - одна использовала более новую («машинописную») версию @google-cloud/datastoreпакетов, которая возвращает объект с конструктором хранилища данных в качестве одного из свойств экспортируемого объекта, и я переключился на другую ветку для задачи, более старую версию хранилища данных. был использован там, который экспортирует конструктор хранилища данных "напрямую" как module.exportsзначение. Я получил ошибку, потому что у node_modules все еще были новые модули, используемые веткой, с которой я переключился.


0

Я тоже сталкивался с чем-то подобным. в вашем файле маршрутов экспортируйте функцию как объект, подобный этому:

 module.exports = {
     hbd: handlebar
 }

и в вашем файле приложения вы можете получить доступ к функции через .hbd, и проблем нет ....!


-1

Не забудьте экспортировать ваш routes.js.

В routes.js, напишите ваши маршруты и весь код в этой функции модуля:

exports = function(app, passport) {

/* write here your code */ 

}

-1

Просто оберните функцию стрелки там, где вам нужны файлы


5
Было бы неплохо, если бы вы показали нам код того, как сделать то, что вы сказали
U10 - Вперед,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.