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

тайги100
источник
Можете ли вы 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и, таким образом, попытка вызвать это как функцию не будет работать. Исправление в этом случае состоит в том, чтобы удалить циклическую зависимость, обычно путем разбивки общего кода на третий модуль, который оба могут загружаться отдельно, хотя особенности исправления циклической зависимости уникальны для каждой ситуации.

jfriend00
источник
Или: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')
})()
mCY
источник
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, и проблем нет ....!

HR Шаххоссейни
источник
-1

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

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

exports = function(app, passport) {

/* write here your code */ 

}
Милани Игорь
источник
-1

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

мехмуд-заман
источник
5
Было бы неплохо, если бы вы показали нам код того, как сделать то, что вы сказали
U10 - Вперед,