Node.js y Express
Sirve para Express, Fastify, Koa, Hono, NestJS y cualquier otro servidor Node.js.
Una aplicación mínima
// server.js
const express = require('express')
const app = express()
const port = process.env.PORT || 8080
app.get('/', (req, res) => res.send('Hello from Express'))
app.listen(port, '0.0.0.0', () => console.log(`listening on ${port}`)){
"scripts": { "start": "node server.js" },
"dependencies": { "express": "^5.1.0" }
}Qué detecta Zenavo
zbpack la compila como Node.js:
| Paso | Comando |
|---|---|
| Instalar | npm install, pnpm install, yarn install o bun install, según el archivo de bloqueo del repositorio (yarn si no hay ninguno) |
| Compilar | el script build, si existe (TypeScript, bundlers) |
| Arrancar | el script start; si no existe, node index.js |
La versión de Node.js sale de engines.node en package.json (22 si no está definida):
"engines": { "node": "22" }Para usar otros comandos, define ZBPACK_BUILD_COMMAND o ZBPACK_START_COMMAND en Settings → Build → zbpack options (Plan de compilación).
Desplegar
- Add Service → GitHub, elige el repositorio y la rama.
- Añade variables, haz clic en Next, comprueba que la vista previa muestra nodejs y haz clic en Deploy.
- Genera un dominio en la pestaña Networking.
Conecta una base de datos
Añade una base de datos al proyecto y referencia sus variables desde el servicio de la aplicación:
DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}
REDIS_URL=${REDIS_CONNECTION_STRING}Ejecuta las migraciones cuando arranque la aplicación, no en la compilación: las compilaciones no llegan a las bases de datos del proyecto. Un script predeploy en package.json se ejecuta antes de start cada vez que arranca el servicio:
"scripts": {
"predeploy": "node migrate.js",
"start": "node server.js"
}TypeScript
Compila en el script build y arranca el resultado:
"scripts": {
"build": "tsc",
"start": "node dist/server.js"
}Deja typescript en dependencies o en devDependencies; ambas se instalan para la compilación.
Problemas habituales
| Síntoma | Causa |
|---|---|
| El despliegue nunca está sano | El servidor escucha en localhost o en un puerto fijo. Escucha en 0.0.0.0 y en process.env.PORT. |
Cannot find module al arrancar | El script start apunta a un archivo que la compilación no generó, o falta una dependencia en package.json. |
| Se usa otro gestor de paquetes | Falta el archivo de bloqueo o hay dos. Deja exactamente uno. |
| Los archivos subidos desaparecen tras un despliegue | El disco del contenedor se sustituye en cada despliegue. Usa un volumen o almacenamiento de objetos. |