Tu aplicación Node.js responde con un error 503 al abrirla en el navegador, pero funciona sin problemas si la ejecutas a mano con node server.js desde la Terminal. Además, el proceso nunca aparece en ps aux. Este artículo explica por qué ocurre y cómo resolverlo en dos pasos.
🔍 Síntomas y dónde ver el error
El error queda registrado en el archivo stderr.log que se genera en la raíz de tu aplicación, es decir, en la carpeta que indicaste como «Application root» en «Setup Node.js App». No aparece en la carpeta logs/ del dominio ni en el error_log del sitio. Puedes abrirlo desde el Administrador de archivos o la Terminal de tu panel.
Según la versión de Node.js, el mensaje se ve de una de estas formas:
Error [ERR_REQUIRE_ESM]: require() of ES Module /home/usuario/domains/su-dominio.com/public_html/mi-app/server.js from /usr/local/lsws/fcgi-bin/lsnode.js not supported.
[ERR_REQUIRE_ESM]: Must use import to load ES Module
code: 'ERR_REQUIRE_ESM'
🧩 Causa
Tu package.json declara "type": "module", es decir, la aplicación usa ES Modules (módulos ECMAScript). El cargador de Node.js Selector abre el archivo de inicio con require(), y en Node.js 18 (y en Node.js 20 anterior a 20.19) require() no acepta módulos ES. La aplicación sí se lanza en cada visita, pero termina en milisegundos con ese error; por eso ves un 503 y el proceso nunca alcanza a aparecer en ps aux.
Al ejecutar node server.js a mano no pasas por ese cargador, por lo que ahí arranca bien. Esto suele hacer pensar que el problema está en el servidor, pero no es así: recrear la aplicación en el panel o tocar tmp/restart.txt no cambia nada, porque el código sigue siendo el mismo.
✅ Solución 1: usar un archivo de inicio .cjs (recomendada)
Crea un archivo llamado start.cjs en la raíz de tu aplicación, en la misma carpeta donde está tu package.json, con este contenido:
(() => import('./server.js'))();
Reemplaza ./server.js por el nombre real de tu archivo de inicio (por ejemplo app.js o index.js). Este pequeño archivo actúa como puente: el cargador lo abre con require() sin problemas y él, a su vez, importa tu aplicación como módulo ES.
Luego indícale al panel que use ese archivo:
- Ingresa a tu panel (cPanel o DirectAdmin) y abre «Setup Node.js App».
- Edita tu aplicación y en el campo «Application startup file» escribe
start.cjs. - Guarda los cambios y haz clic en «Restart».
🔄 Solución 2: cambiar la versión de Node.js a 20 o 22
Las versiones 20 (desde 20.19) y 22 de Node.js sí permiten cargar módulos ES con require(), así que también puedes resolverlo sin agregar archivos:
- En «Setup Node.js App», edita tu aplicación.
- En «Node.js version» selecciona 20 o 22.
- Guarda los cambios y haz clic en «Restart».
💡 Si tu código usa
awaitde nivel superior (fuera de una función async), esta opción no es suficiente: en ese caso usa el archivostart.cjsde la Solución 1 o convierte tu aplicación a CommonJS.
🧪 Verificar que funcionó
Abre tu dominio en el navegador. Si la aplicación responde, ya está resuelto. Si sigue mostrando 503, vuelve a revisar el stderr.log en la raíz de la aplicación: el mensaje nuevo indicará el siguiente problema a corregir en tu código.
Nuestro soporte para Node.js se limita al funcionamiento del servidor y del panel; para ajustes en el código de tu aplicación te recomendamos apoyarte en un programador Node.js.