Objetivos de aprendizaje
Después de leer este artículo podrás:
- Distinguir un paquete que falta de una ruta de archivo incorrecta
- Arreglar las versiones de Node.js y de Python del error paso a paso
- Evitar que el error vuelva en el siguiente deploy
En esta página
- ¿Qué significan realmente estos errores?
- ¿Falta el paquete en las dependencias?
- ¿La ruta, las mayúsculas o la extensión están mal?
- ¿El archivo principal o la salida del build están mal?
- ¿Por qué Python dice "No module named"?
- ¿Cómo diagnosticarlo rápido?
- ¿Cómo evitar que vuelva?
- Cómo hacerlo en Square Cloud
- Preguntas frecuentes
Tu app arrancaba bien en tu computadora, hiciste el deploy y el log termina con uno de estos mensajes:
Error: Cannot find module 'express'
Require stack:
- /app/index.js
at Module._resolveFilename (node:internal/modules/cjs/loader:1517:15)
...
at Module._compile (node:internal/modules/cjs/loader:1871:14) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '/app/index.js' ]
}ModuleNotFoundError: No module named 'discord'Los dos mensajes dicen lo mismo: un import o require nombró algo que el runtime no pudo localizar. El arreglo casi nunca es un misterio, pero tienes que leer el mensaje antes de adivinar. El nombre entre comillas te dice cuál de las dos familias de problema tienes.
¿Qué significan realmente estos errores?#
En Node.js, require() lanza MODULE_NOT_FOUND cuando la ruta o el paquete no existe. La versión de ES modules, import, lanza ERR_MODULE_NOT_FOUND. En Python, ModuleNotFoundError es una subclase de ImportError, que se lanza cuando no se pudo localizar un módulo (documentación de Python).
Esta es la forma de ES modules, para un paquete que falta y para un archivo relativo:
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'express' imported from /app/index.js
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/app/utils' imported from /app/index.js
Did you mean to import "./utils.js"?Fíjate en cómo es el nombre:
- Un nombre simple (
express,discord): un paquete que no está instalado donde se ejecuta la app. - Una ruta (
./utils,/app/utils): un archivo que el runtime no encontró en esa ubicación exacta.
Todo lo que sigue parte de esa división.
¿Falta el paquete en las dependencias?#
Es la causa más común. Para un nombre de paquete simple, Node.js empieza en la carpeta del archivo actual, busca en node_modules y luego sube por las carpetas padre hasta la raíz del sistema de archivos (documentación de Node.js). Si ningún node_modules de ese camino contiene el paquete, aparece el error.
Revisa esto en orden:
- ¿Está en
package.json? Si lo instalaste connpm install express, aparece en la lista. Si copiaste código de un tutorial y nunca lo instalaste, no está. - ¿Está solo en
devDependencies? npm indica quedependencieses para los paquetes de runtime ydevDependenciespara herramientas que los usuarios de tu módulo no necesitan, como frameworks de pruebas y transpiladores (documentación de npm). Una instalación de producción puede omitir los paquetes de desarrollo, ynpm cilos omite por defecto cuandoNODE_ENVesproduction(documentación de npm). Si tu app lo importa en runtime, muévelo:
npm install --save-prod express- ¿La instalación se ejecutó de verdad en el servidor? Subir la carpeta
node_modulesde tu PC no es fiable. Envíapackage.jsonjunto con el lockfile e instala a partir de ellos.
npm ci es el comando correcto para una instalación limpia. Exige un package-lock.json existente, borra cualquier node_modules que haya y termina con error, en lugar de actualizar el lockfile, cuando package.json y el lockfile no coinciden. Ese último comportamiento es útil: convierte una diferencia silenciosa en un fallo visible.
npm ci
node index.jsSi npm ci falla porque el lockfile no está sincronizado, ejecuta npm install en local, haz commit del lockfile actualizado y vuelve a hacer el deploy.
¿La ruta, las mayúsculas o la extensión están mal?#
Cuando el nombre es una ruta, la causa es un archivo que no está donde el import dice.
Mayúsculas y minúsculas. En Linux, ./Utils.js y ./utils.js son dos archivos distintos. Los sistemas de archivos de Windows y macOS normalmente ignoran esa diferencia, así que un import con las mayúsculas equivocadas funciona en tu máquina y falla en el servidor. Renombra el archivo o corrige el import para que coincidan exactamente. Si solo cambias las mayúsculas del nombre de un archivo, asegúrate de que tu cliente de Git registre el cambio, porque algunas configuraciones lo ignoran.
Falta la extensión en ES modules. Con import, los especificadores relativos necesitan la extensión, y los índices de directorio deben indicarse completos (documentación de ESM de Node.js). Esto funciona con require en CommonJS, pero no con import:
// Falla en un ES module: ERR_MODULE_NOT_FOUND
import { helper } from "./utils";
// Funciona
import { helper } from "./utils.js";
import { setup } from "./startup/index.js";Tu app es un ES module cuando package.json tiene "type": "module" o el archivo termina en .mjs. Si usas TypeScript con un bundler en local, los imports sin extensión pueden funcionar ahí y romperse cuando ejecutas la salida directamente.
Un archivo que nunca se subió. Comprueba que el archivo está en tu ZIP o en tu commit. Los culpables habituales son una línea del .gitignore o una subida que se saltó una carpeta. En un monorepo, un paquete compartido que está fuera de la carpeta que desplegaste también faltará.
¿El archivo principal o la salida del build están mal?#
Algunos proyectos compilan a una carpeta dist o build. Si tu comando de inicio apunta a dist/index.js y el paso de build nunca se ejecutó, o dist está ignorada por el control de versiones, falta el propio punto de entrada:
Error: Cannot find module '/app/dist/index.js'Confirma tres cosas: el comando de build se ejecuta antes del de inicio, la carpeta de salida forma parte de lo que despliegas (o se genera en el servidor) y el archivo principal de tu configuración coincide con la ruta real. Revisa también "main" en package.json si importas el paquete por su nombre, porque un main ausente o que no se puede resolver, sin un index.js, hace que Node.js informe que falta el módulo entero (documentación de Node.js).
¿Por qué Python dice "No module named"?#
La versión de Python tiene sus propias causas.
El paquete no está instalado. Instálalo y regístralo para que el siguiente entorno también lo tenga:
python -m pip install discord.py
python -m pip freeze > requirements.txtDespués, en el destino, python -m pip install -r requirements.txt. La documentación de pip describe este flujo de freeze e instalación, y también aclara que pip freeze no calcula un lockfile ni el resultado de un solver (documentación de pip). Para fijar todo por completo, usa una herramienta de lockfile.
El nombre del import difiere del nombre de instalación. Esto confunde a mucha gente:
| Escribes | Instalas |
|---|---|
import yaml |
PyYAML |
import PIL |
Pillow |
import cv2 |
opencv-python |
import dotenv |
python-dotenv |
import discord |
discord.py |
Intérprete equivocado. pip y python pueden pertenecer a instalaciones distintas. Usa python -m pip install ... para que el paquete vaya al intérprete que ejecutará tu código. Dentro de un entorno virtual, actívalo primero.
Un archivo local oculta el módulo o no coincide con él. Un archivo llamado discord.py o random.py en tu proyecto puede ocultar el paquete real. Para tus propios módulos, comprueba que la estructura de carpetas coincide con el import y que ejecutas la app desde el directorio de trabajo esperado.
¿Cómo diagnosticarlo rápido?#
Empieza por el mensaje:
- Copia el nombre exacto del módulo del log.
- ¿Nombre simple? Ejecuta
npm ls express(Node.js) opython -m pip show discord.py(Python) en el mismo entorno que ejecuta la app. - ¿Ruta? Lista la carpeta y compara el nombre carácter por carácter, incluidas mayúsculas y extensión.
- ¿Sigue sin funcionar? Ejecuta el import que falla de forma aislada:
node -e "require.resolve('express')"
node --input-type=module -e "await import('express')"
python -c "import discord; print(discord.__file__)"require.resolve lanza MODULE_NOT_FOUND cuando no encuentra el módulo, así que muestra lo que ve el runtime sin arrancar toda tu app.
Un caso más de Node.js: require() solo puede cargar un ES module si no tiene await de nivel superior; si lo tiene, lanza ERR_REQUIRE_ASYNC_MODULE (documentación de Node.js). Es un error distinto, pero aparece en el mismo lugar. En esa situación, cambia a import().
¿Cómo evitar que vuelva?#
- Trata el lockfile como parte del código: haz commit de
package-lock.jsony usanpm cipara instalar. - Mantén los paquetes de runtime en
dependencies. - Nombra los archivos en minúsculas e impórtalos exactamente con la misma escritura.
- En ES modules, escribe siempre la extensión.
- Fija los paquetes de Python en
requirements.txte instala con el mismo intérprete que ejecuta la app. - Prueba en local la forma desplegada: borra
node_modules, ejecutanpm ciy arranca la app. Si falla ahí, fallará en el servidor.
Para otros fallos de deploy relacionados, mira cómo leer errores de build, cómo leer los logs de tu aplicación y cómo hospedar una app Node.js.
Cómo hacerlo en Square Cloud#
En Square Cloud haces el deploy subiendo un ZIP, con la CLI, con un push a GitHub o con la extensión de VS Code. Elijas lo que elijas, la primera comprobación es la misma: abre los logs en tiempo real, copia el nombre del módulo del error y compáralo con los archivos que realmente subiste. Al iniciar, la plataforma ejecuta npm install cuando no existe node_modules, con NODE_ENV=production: un paquete que solo está en devDependencies no se instala y provoca este error.
El gestor de archivos en el navegador te muestra los archivos de tu aplicación, así que puedes confirmar que la ruta del error existe y que sus mayúsculas coinciden. El editor guarda directamente en la aplicación, sin redeploy.
Si el error nombra tu archivo de entrada, comprueba que la configuración del archivo principal apunta a un archivo que existe. Esa configuración está en squarecloud.app, que es opcional: el panel puede generarlo en el deploy (runtime, memoria, archivo principal) o puedes escribirlo en la raíz del proyecto. No hay paso de build, así que un punto de entrada en dist exige subir la carpeta ya compilada o poner el build en el comando de inicio.
Cuando tengas el arreglo en local, envíalo con el comando commit de la CLI o con un push a GitHub mediante la GitHub Action oficial, que puede ejecutar commit --restart en cada push. El flujo completo está en la página de la CLI.
Deploy
Sube desde GitHub, la CLI o un ZIP y publica en segundos
Preguntas frecuentes
¿Cuál es la diferencia entre MODULE_NOT_FOUND y ERR_MODULE_NOT_FOUND?
MODULE_NOT_FOUND es el código que Node.js usa cuando require() (CommonJS) no puede resolver una ruta. ERR_MODULE_NOT_FOUND es el código del mismo fallo con import (ES modules). Las causas se solapan, pero los ES modules además exigen la extensión completa en los imports relativos.
¿Por qué mi app funciona en mi PC pero falla con 'Cannot find module' después del deploy?
Tu máquina tiene archivos y paquetes que la copia desplegada no tiene: un paquete instalado de forma global, una carpeta node_modules que nunca subes, un paquete que solo está en devDependencies o un archivo cuyo nombre difiere en mayúsculas. Linux trata Utils.js y utils.js como archivos distintos; Windows y macOS normalmente no.
¿ModuleNotFoundError significa que debo ejecutar pip install?
Normalmente sí, pero revisa primero el nombre del paquete. El nombre del import y el de instalación suelen ser distintos: import yaml viene de PyYAML, import PIL de Pillow, import cv2 de opencv-python. Confirma también que pip instala en el mismo intérprete de Python que ejecuta tu app.
¿Debo subir mi carpeta node_modules?
No. Envía package.json y el lockfile, e instala en el destino con npm ci o el equivalente de tu gestor de paquetes. Una carpeta node_modules generada en otro sistema operativo puede contener binarios que no funcionan en otro lugar.
Más en Deploy
Ver los 33 artículos- Qué son las variables de entornoLas variables de entorno son pares clave-valor que el sistema operativo entrega a un proceso al iniciar. Aprende a leerlas en Node.js y Python sin exponer tokens.
- Qué es un deploy o despliegueUn deploy o despliegue lleva una versión de tu código a un servidor, la prepara y la pone en marcha. Conoce las etapas, los métodos y cómo hacer rollback.
- ¿Cuánta RAM y CPU necesita mi aplicación?Dimensiona RAM y CPU midiendo el pico real de la aplicación y sumando un margen del 30%. Mira cómo medir en Node.js, Python y Java y qué hacer cuando falte.
- Deploy automático con GitHub ActionsEl deploy automático con GitHub Actions envía tu código al servidor en cada push. Mira el workflow paso a paso, los secrets, las pruebas y los errores comunes.