Add Graceful Shutdown example to fix Nodemon hanging on restarts (EADDRINUSE)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 65/100
- Tipo de issue
- Documentación
- Claridad
- Bastante claro
- Estado de actividad
- Tranquilo
- Stack tecnológico
- express, node.js, typescript
- Área
- documentation
Línea de trabajo
No se especifica ningún archivo de destino ni ninguna prueba; comienza localizando la documentación oficial de configuración de Express/Turso. Añade el ejemplo proporcionado de graceful shutdown y verifica que explique cómo gestionar SIGINT, SIGTERM y SIGUSR2 y cómo cerrar la conexión de @libsql/client para que Nodemon pueda reiniciarse sin EADDRINUSE.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Hello! I am a beginner using Turso with Express and Nodemon, and I recently ran into a very frustrating issue that took me a while to figure out.
I'm opening this issue as a documentation request because I think adding a small note about this could save other developers a lot of time!
The Problem I Faced 🐛
Whenever I saved a file, nodemon would attempt to restart my Express server, but it would fail or my new routes wouldn't show up. I was getting errors like:
Cannot GET /my-new-route(the server was stuck on the old code)EADDRINUSE: address already in use :::3000
It turns out that @libsql/client holds an active, persistent socket connection. When nodemon sends the restart signal (SIGUSR2), Node.js refuses to exit because the database connection is still keeping the event loop alive. This leaves the old server running as a "zombie" process holding port 3000.
The Solution 🛠️
I finally figured out that I needed to explicitly call tursoClient.close() inside a graceful shutdown handler so nodemon could clean up and restart properly.
Since this is such a common trap when setting up local development, could we add a small snippet about 'Graceful Shutdowns' to the official documentation?
Here is the solution code that worked perfectly for me, which might be helpful to add to the docs:
import express from "express";
import { createClient } from "@libsql/client";
const app = express();
const PORT = process.env.PORT || 3000;
export const tursoClient = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN!,
});
const server = app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
// Graceful shutdown — close turso connection so nodemon can restart cleanly
const shutdown = async () => {
console.log("Shutting down gracefully...");
tursoClient.close();
server.close(() => {
process.exit(0);
});
};
// Handle Ctrl+C
process.on("SIGINT", shutdown);
// Handle Docker/System shutdown
process.on("SIGTERM", shutdown);
// Handle Nodemon restarts
process.once("SIGUSR2", async () => {
await shutdown();
});
Thank you for the amazing database!
- Lenguaje dominante
- C
- Estrellas
- 17.3k
- Forks
- 545
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de tursodatabase/libsql
-
Rust local Row::get_value truncates embedded NUL TEXT and panics on malformed UTF-8 (0.9.30)Posiblemente ocupada @Sanjays2402 la tomó hace 10 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
tursodatabase/libsql#2285 ·
-
libsql-ffi: broken builds under Nix on macOSPosiblemente ocupada @frectonz la tomó hace 59 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
tursodatabase/libsql#2275 ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 65/100
tursodatabase/libsql#1925 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
tursodatabase/libsql#1892 ·
-
Rust: final update-hook closure and captures leak on connection closePosiblemente ocupada @atontini la tomó hace 3 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 58/100
tursodatabase/libsql#2295 ·
Todos los issues de tursodatabase/libsql
Issues similares
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
valkey-io/valkey#4979 · 1 reacción ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
colbymchenry/codegraph#2770 ·
Los mantenedores suelen responder en 1 día
-
canard.c 5.0.0: static random() conflicts with newlib's random() (fails to build on ESP-IDF)Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
OpenCyphal/libcanard#264 ·
-
area/ysql kind/enhancement priority/medium status/awaiting-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 73/100
yugabyte/yugabyte-db#35578 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
Los mantenedores suelen responder en 1 día