NodeJs: TypeError: require (…) no es una función

86

Estoy tratando de requerir un archivo y luego pasarlo a una var. Estoy siguiendo este tutorial para crear un sistema de autenticación. Después de escribir el archivo server.js e intentar compilar, obtuve un error de bson, por lo tanto, cambié la línea que requería la versión de lanzamiento en mangosta.

Aquí están mi código y error:

server.js

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

Error

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

He leído que esto generalmente significa que requireJS no se está cargando correctamente, pero no sé por qué o cómo solucionarlo.

Editar debido al comentario:

Como se preguntó, aquí está el resultado deconsole.log(require);

taigi100
fuente
¿Puedes console.log(require)antes de la línea que falla? No debería necesitar requireJS en el lado del servidor, node.js tiene un sistema de módulos incorporado (CommonJS, también usa la requirefunción). Algo parece estar cambiando la requirevariable global .
kraf

Respuestas:

107

Creo que esto significa que module.exportsen su ./app/routesmódulo no está asignado para ser una función, por lo tanto, require('./app/routes')no se resuelve en una función, por lo que no puede llamarlo como una función como esta require('./app/routes')(app, passport).

Muéstranos ./app/routessi quieres que comentemos más sobre eso.

Debería verse algo así;

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

Está exportando una función que luego se puede llamar como require('./app/routes')(app, passport).


Otra razón por la que podría ocurrir un error similar es si tiene una dependencia de módulo circular donde el módulo A está intentando require(B)y el módulo B está intentando require(A). Cuando esto suceda, será detectado por el require()subsistema y uno de ellos regresará como nully, por lo tanto, intentar llamarlo como una función no funcionará. La solución en ese caso es eliminar la dependencia circular, generalmente dividiendo el código común en un tercer módulo que ambos pueden cargar por separado, aunque los detalles de arreglar una dependencia circular son únicos para cada situación.

jfriend00
fuente
O:module.exports.functionName = function functionName(app, passport) { ... }
Magne
@Magne: pero el OP está tratando de hacer require('./app/routes')(app, passport);lo que no funcionará de la forma en que muestra la exportación.
jfriend00
Cierto, mi mal. Mi caso de uso fue ligeramente diferente. Quería exportar una función con nombre.
Magne
61

Para mí, cuando hago la función Invocada inmediatamente, necesito poner ;al final de require().

Error:

const fs = require('fs')

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

Bueno:

const fs = require('fs');

(() => {
  console.log('wow')
})()
mCY
fuente
7
¡Este también era mi problema! El problema realmente es que el tiempo de ejecución ignora los espacios en blanco en este caso, por lo que parece que está pasando el cuerpo de su función () => {}como un argumento para lo que sea devuelto por require( ... ). ¡Terrible!
Will Brickner
sí, este es un buen argumento a favor del punto y coma en el debate 'punto y coma en JS'. Afortunadamente, la ausencia de punto y coma parece ser un problema solo en el contexto de IIFE, que están pasando de moda
JP Lew
1
¡¡Oh Dios mío!! Vengo de allí puppeteery casi solicito un problema hasta que encontré uno aquí. Uf ... nunca pensé que ;eso me molestaría tanto.
Irfandy Jip
1
¡Gran solución! Tenga en cuenta que en realidad debería poner el punto y coma antes de cada función que se auto-invoca. Adapté esta construcción:;(() => {})()
Dmitry
¿Cuáles son las opciones si el código está dentro de una biblioteca? Tengo una biblioteca node_modules (node-mailjet) que no usa punto y coma en absoluto. Puedo construir con Webpack ok localmente, pero cuando construyo en Docker, aparece este error :(
Javier Guzmán
12

Para mí, este fue un problema con las dependencias cíclicas.

IOW, el módulo A requería el módulo B y el módulo B requería el módulo A.

Entonces, en el módulo B, require('./A')es un objeto vacío en lugar de una función.

Cómo lidiar con las dependencias cíclicas en Node.js

Bryan Larsen
fuente
0

Para mí, obtuve un error similar cuando cambié entre ramas: una versión más nueva ("mecanografiado") de @google-cloud/datastorepaquetes que devuelve el objeto con el constructor del almacén de datos como una de las propiedades del objeto exportado y cambié a otra rama para una tarea, una versión anterior del almacén de datos se usó allí, que exporta el constructor de Datastore "directamente" como module.exportsvalor. Recibí el error porque node_modules todavía tenía módulos más nuevos utilizados por la rama desde la que cambié.

Kote Isaev
fuente
0

Yo también me he enfrentado a algo así. en su archivo de rutas, exporte la función como un objeto como este:

 module.exports = {
     hbd: handlebar
 }

y en su archivo de aplicación, puede tener acceso a la función por .hbd y no hay ptoblem ....!

HR.Shahhosseini
fuente
-1

Recuerde exportar su routes.js.

En routes.js, escriba sus rutas y todo su código en este módulo de funciones:

exports = function(app, passport) {

/* write here your code */ 

}
Milani Igor
fuente
-1

Simplemente ajuste la función de flecha donde necesita los archivos

mehmood-zaman
fuente
5
Sería bueno si nos mostrara algún código de cómo hacer lo que dijo
U10-Adelante