NodeJs: TypeError: require (…) não é uma função

86

Estou tentando solicitar um arquivo e depois passá-lo para um var. Estou seguindo este tutorial para criar um sistema de autenticação. Depois de escrever o arquivo server.js e tentar compilar, recebi um erro de bson, portanto, alterei a linha que exigia a versão de lançamento dele no mongoose.

Aqui estão meu código e erro:

server.js

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

Erro

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

Eu li que isso geralmente significa que o requireJS não está sendo carregado corretamente, mas não sei por que ou como consertar.

Editar devido ao comentário:

Conforme solicitado, aqui está o resultado deconsole.log(require);

taigi100
fonte
Você pode console.log(require)antes da linha que falha? Você não deve precisar de requireJS no lado do servidor, node.js tem um sistema de módulo embutido (CommonJS, também usa requirefunção). Algo parece estar mudando a requirevariável global .
kraf

Respostas:

107

Eu acho que isso significa que module.exportsem seu ./app/routesmódulo não está atribuído para ser uma função, portanto require('./app/routes'), não resolve para uma função, portanto, você não pode chamá-lo como uma função como esta require('./app/routes')(app, passport).

Mostre-nos ./app/routesse você deseja que comentemos mais sobre isso.

Deve ser parecido com isto;

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

Você está exportando uma função que pode ser chamada como require('./app/routes')(app, passport).


Uma outra razão pela qual um erro semelhante poderia ocorrer é se você tiver uma dependência de módulo circular onde o módulo A está tentando require(B)e o módulo B está tentando require(A). Quando isso acontecer, ele será detectado pelo require()subsistema e um deles voltará comonull e, portanto, tentar chamar isso como uma função não funcionará. A correção nesse caso é remover a dependência circular, geralmente dividindo o código comum em um terceiro módulo que ambos podem carregar separadamente, embora as especificações de corrigir uma dependência circular sejam exclusivas para cada situação.

jfriend00
fonte
Ou:module.exports.functionName = function functionName(app, passport) { ... }
Magne
@Magne - Mas o OP está tentando fazer o require('./app/routes')(app, passport);que não vai funcionar da maneira que você mostra a exportação.
jfriend00
Verdade, meu mal. Meu caso de uso era ligeiramente diferente. Eu queria exportar uma função nomeada.
Magne
61

Para mim, quando faço a função Imediatamente invocado, preciso colocar ;no final derequire() .

Erro:

const fs = require('fs')

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

Boa:

const fs = require('fs');

(() => {
  console.log('wow')
})()
mCY
fonte
7
Esse era o meu problema também! O problema realmente é que o tempo de execução ignora os espaços em branco neste caso e, portanto, parece que você está passando o corpo da função () => {}como um argumento para o que quer que seja retornado por require( ... ). Terrível!
Will Brickner,
sim, este é um bom argumento a favor do ponto-e-vírgula no debate 'ponto-e-vírgula em JS'. Felizmente, a ausência de ponto-e-vírgulas parece ser um problema apenas no contexto de IIFEs, que estão saindo de moda
JP Lew
1
Oh meu Deus!! Eu vim de puppeteerlá e quase pedi um problema até que encontrei um aqui. Ufa ... nunca pensei que isso ;fosse me incomodar tanto.
Irfandy Jip
1
Ótima solução! Observe que você realmente deve colocar o ponto-e-vírgula antes de cada função de auto-chamada. Eu adaptei esta construção:;(() => {})()
Dmitry
Quais são as opções se o código estiver em uma biblioteca? Eu tenho uma biblioteca node_modules (node-mailjet) que não usa ponto-e-vírgula. Posso construir com Webpack ok localmente, mas quando eu construo no Docker, recebo este erro :(
Javier Guzmán
12

Para mim, esse era um problema com dependências cíclicas.

IOW, módulo A requer módulo B e módulo B requer módulo A.

Portanto, no módulo B, require('./A')é um objeto vazio em vez de uma função.

Como lidar com dependências cíclicas em Node.js

Bryan Larsen
fonte
0

Para mim, recebi um erro semelhante ao alternar entre os branches - uma versão mais recente ("typescriptish") usada de @google-cloud/datastorepacotes que retorna o objeto com o construtor Datastore como uma das propriedades do objeto exportado e eu mudei para outro branch para uma tarefa, uma versão mais antiga do armazenamento de dados foi usado lá, que exporta o construtor do Datastore "diretamente" como module.exportsvalor. Recebi o erro porque node_modules ainda tinha módulos mais novos usados ​​pela filial de onde troquei.

Kote Isaev
fonte
0

Eu também enfrentei algo assim. em seu arquivo de rotas, exporte a função como um objeto como este:

 module.exports = {
     hbd: handlebar
 }

e em seu arquivo de aplicativo, você pode ter acesso à função por .hbd e não há problema ....!

HR.Shahhosseini
fonte
-1

Lembre-se de exportar o seu routes.js.

Em routes.js, escreva suas rotas e todo o seu código neste módulo de função:

exports = function(app, passport) {

/* write here your code */ 

}
Milani Igor
fonte
-1

Basta envolver a função de seta onde você deseja os arquivos

mehmood-zaman
fonte
5
Seria bom se você nos mostrasse um código de como fazer o que você disse
U10-Forward