Estoy usando node.js para crear una aplicación web. Cuando ejecuto la aplicación (ya sea abriendo index.html en el navegador o usando el comando "npm start" en la terminal) obtengo dos errores:
Error de referencia no capturado: el proceso no está definido
Error de referencia no capturado: el requerimiento no está definido
Resolví el error "requerir no está definido" al incluir específicamente en mi etiqueta de encabezado index.html el enlace a este script, donde se define la función requerida. Sin embargo, no puedo encontrar algo similar para la función de proceso.
Mi pregunta es doble:
¿Por qué es necesario volver a definir los módulos integrados de node.js? ¿Por qué no se reconocen como son, es decir, "módulos incorporados"? ¿El término "módulo incorporado" no significa que un módulo no necesita ser redefinido externamente/de segunda mano?
¿Hay alguna manera de resolver este problema? Mi secuencia de comandos es muy simple, solo estoy tratando de usar una función básica de node.js, por lo que no puedo descifrar qué errores podría haber cometido.
Si alguien ha tenido este problema y ha encontrado una forma de evitarlo o una razón por la que esto sucede, sería de gran ayuda.
El código de Node.js debe ejecutarlo el proceso del nodo, no el navegador (el código debe ejecutarse en el servidor).
Para ejecutar el código, debe ejecutar el comando:
node server.js
Y luego puede acceder a su servidor desde un navegador escribiendo " http://localhost:8080 ", por ejemplo. Debes tener un archivo server.js (o el que sea) con el código del servidor que quieras (en este caso, creando un servidor web en el puerto 8080).
Puede seguir este sencillo ejemplo, utilizando express como módulo de servidor http: http://expressjs.com/starter/hello-world.html
Webpack puede inyectar variables de entorno en el código .js del "lado del cliente" (muy útil en el caso de SPA/PWA). Debe definirlos como complementos en webpack.config.js
webpack.config.js module.exports = { plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), 'process.env.MY_ENV': JSON.stringify(process.env.MY_ENV), ... and so on ... }) ], }
Ahora puede acceder a él en el lado del cliente:
app.js // Something like that if(process.env.NODE_ENV === 'debug'){ setDebugLevel(1) }
Si enfrenta este problema y está utilizando un paquete web, puede obtener los datos de process
deseados inyectados en el paquete del cliente utilizando DefinePlugin
dentro de su webpack.config.js
.
En el siguiente ejemplo, muestro cómo agregar varias cosas al objeto process.env
para que estén disponibles en el navegador:
.env
usando la biblioteca dotenvNODE_ENV
, que es 'development'
o 'production'
# .env API_KEY=taco-tues-123 API_SECRET=secret_tacos
// webpack.config.js const dotenv = require('dotenv').config({ path: __dirname + '/.env' }) const isDevelopment = process.env.NODE_ENV !== 'production' module.exports = { plugins: [ new webpack.DefinePlugin({ 'process.env': JSON.stringify(dotenv.parsed), 'process.env.NODE_ENV': JSON.stringify(isDevelopment ? 'development' : 'production'), }), ].filter(Boolean), }
// Within client side bundle (React) // src/App.jsx console.log(process.env) // {API_KEY: "taco-tues-123", API_SECRET: "secret_tacos"} console.log(process.env.NODE_ENV) // development
Tenga en cuenta que console.log(process.env)
solo tiene los valores del archivo .env
y que NODE_ENV
no forma parte del objeto process.env
.
En el siguiente ejemplo, muestro cómo estaba tratando de inyectar el objeto process.env
que me llevó a este desbordamiento de pila. También incluyo un punto destacado de la documentación del paquete web sobre por qué el siguiente código no funcionaba.
module.exports = { plugins: [ new webpack.DefinePlugin({ 'process.env': { ...dotenv.parsed, 'NODE_ENV': JSON.stringify(isDevelopment ? 'development' : 'production') } }), ].filter(Boolean), }
// Within client side bundle (React) // src/App.jsx console.log(process.env) // Uncaught ReferenceError: taco is not defined console.log(process.env.NODE_ENV) // development
Del paquete web DefinePlugin docs :
Advertencia Al definir valores para el proceso, prefiera
'process.env.NODE_ENV': JSON.stringify('production')
terminado
process: { env: { NODE_ENV: JSON.stringify('production') } }
El uso de este último sobrescribirá el objeto de proceso, lo que puede romper la compatibilidad con algunos módulos que esperan que se definan otros valores en el objeto de proceso.
Inyectar dotenv.parsed
en el paquete del cliente como se describe expondrá estos secretos al cliente. Para fines de desarrollo, no es un gran problema, pero en un entorno de producción implementado, cualquier contraseña o clave de API privada será visible para cualquiera que las busque.