NodeJ: 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( ... ). Жахливо!
Will Brickner

так, це вагомий аргумент на користь крапки з комою у дебатах про "крапку з комою в JS". На щастя, відсутність крапки з комою здається проблемою лише в контексті IIFE, які випадають з моди
JP Lew

1
Боже мій!! Я приїхав puppeteerі майже попросив там випуск, поки не знайшов його тут. Фу ... ніколи не думав, що ;це так сильно мене турбуватиме.
Irfandy Jip

1
Чудове рішення! Зверніть увагу, що насправді слід ставити крапку з комою перед кожною функцією самовиклику. Я адаптував цю конструкцію:;(() => {})()
Дмитро

Які варіанти, якщо код знаходиться в бібліотеці? У мене є бібліотека node_modules (node-mailjet), яка взагалі не використовує крапку з комою. Я можу будувати за допомогою Webpack нормально локально, але коли я будую на Docker, він отримує таку помилку :(
Хав'єр Гусман,


0

Для мене я отримав подібну помилку при перемиканні між гілками - одна використовувала новішу ("typecriptish") версію @google-cloud/datastoreпакетів, яка повертає об'єкт з конструктором Datastore як одне з властивостей експортованого об'єкта, і я переключився на іншу гілку для завдання, стару версію сховища даних був використаний там, який експортує конструктор Datastore "безпосередньо" як module.exportsзначення. Я отримав помилку, оскільки node_modules все ще мали новіші модулі, що використовуються гілкою, з якої я перейшов.


0

Я теж стикався з чимось подібним. у файлі маршрутів експортуйте функцію як такий об’єкт:

 module.exports = {
     hbd: handlebar
 }

а у вашому файлі програми ви можете отримати доступ до функції за допомогою .hbd, і немає ptoblem ....!


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