fonction de fermeture du serveur nodejs

WBOY
Libérer: 2023-05-13 20:07:06
original
749 Les gens l'ont consulté

Avec le développement et l'application continus de la technologie Node.js, l'application de création de serveurs Web devient de plus en plus répandue. Lors du processus de développement, nous rencontrons souvent une exigence : arrêter le serveur. Alors, comment arrêter le serveur avec précision et élégance dans une application Node.js ? Cet article explique comment utiliser Node.js pour créer une application capable d'arrêter le serveur en douceur.

1. Démarrage et arrêt du serveur Node.js
Dans Node.js, le démarrage du serveur est très simple. Il vous suffit d'utiliser le module http intégré pour terminer. Par exemple :

const http = require('http');
const server = http.createServer((req, res) => {
    res.end('Hello World!');
});
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});
Copier après la connexion

Le code ci-dessus crée un serveur HTTP et le lie au port 3000. Bien entendu, vous pouvez également utiliser des frameworks tels qu'Express pour créer des serveurs Web. Mais quel que soit le framework utilisé, la méthode d’arrêt du serveur est fondamentalement la même.

Lorsque nous devons arrêter le serveur, nous pouvons utiliser l'une des deux méthodes suivantes.

1. Utilisez Ctrl + C pour forcer la fin du processus
Lorsque nous démarrons l'application Node.js à l'aide de la ligne de commande, nous pouvons terminer le processus en appuyant sur la combinaison de touches Ctrl + C. Cette méthode est simple et rapide, mais elle n’est pas élégante et n’effectue pas certains travaux de nettoyage nécessaires, ce qui peut poser certains problèmes.

2. Arrêtez le serveur en écoutant le signal SIGINT
Dans Node.js, vous pouvez écouter l'événement de signal et effectuer certaines opérations lorsque l'événement se produit. Nous pouvons arrêter le serveur en douceur en écoutant l'événement de signal SIGINT et en effectuant certaines opérations nécessaires, telles que la libération de ressources, la sauvegarde de l'état, etc. Voici un exemple de code :

const http = require('http');
const server = http.createServer((req, res) => {
    res.end('Hello World!');
});
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

process.on('SIGINT', () => {
    console.log('Received SIGINT signal, shutting down server...');
    server.close(() => {
        console.log('Server has been shut down.');
        process.exit();
    });
});
Copier après la connexion

Dans le code ci-dessus, nous écoutons le signal SIGINT via l'objet de processus. Lorsque le signal est déclenché, les informations du journal sont générées et le serveur Web est arrêté correctement. La méthode server.close() dans le code peut arrêter le serveur et exécuter la fonction de rappel une fois toutes les connexions déconnectées. Dans la fonction de rappel, nous affichons les informations sur l'arrêt du serveur et utilisons la méthode process.exit() pour quitter le processus.

Il est à noter qu'en utilisation réelle, nous pourrons être amenés à effectuer certaines opérations supplémentaires, comme la sauvegarde de l'état dans la base de données, l'envoi d'e-mails de notification, etc. Ces opérations peuvent être placées dans une fonction de rappel pour garantir qu'elles sont exécutées lorsque le serveur est arrêté.

2. Arrêt progressif du serveur Node.js
Dans l'exemple ci-dessus, nous avons terminé le processus de base d'arrêt du serveur. Cependant, dans les applications réelles, certaines optimisations peuvent être nécessaires pour garantir un arrêt plus progressif du serveur.

1. Délai d'attente pour le traitement des demandes
Lorsque le serveur Web traite une demande, si la demande prend trop de temps, le serveur peut ne pas s'arrêter correctement. Par conséquent, avant d'arrêter le serveur, nous devons arrêter de traiter toutes les demandes ou définir un délai d'attente pour la demande afin de garantir que le traitement est terminé dans le délai imparti.

const http = require('http');
const server = http.createServer((req, res) => {
    res.end('Hello World!');
});
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

let connections = [];

server.on('connection', (connection) => {
    connections.push(connection);
    connection.on('close', () => {
        const index = connections.indexOf(connection);
        if (index !== -1) {
            connections.splice(index, 1);
        }
    });
});

function closeConnections() {
    console.log('Closing all connections...');
    connections.forEach((connection) => {
        connection.end();
    });
    setTimeout(() => {
        connections.forEach((connection) => {
            connection.destroy();
        });
        server.close(() => {
            console.log('Server has been shut down.');
            process.exit();
        });
    }, 10000);
}

process.on('SIGINT', () => {
    console.log('Received SIGINT signal, shutting down server...');
    closeConnections();
});
Copier après la connexion

2. Gérer les demandes en attente
Lorsque le serveur Web traite une demande, cela peut impliquer plusieurs opérations, telles que la lecture de fichiers, l'interrogation de la base de données, etc. Si ces opérations ne sont pas terminées avant l'arrêt du serveur, cela peut entraîner une perte de données, une interruption de la connexion et d'autres problèmes. Par conséquent, avant d’arrêter le serveur, nous devons nous assurer que toutes les opérations sont terminées. Par exemple, utilisez Promise pour gérer la lecture de fichiers.

const http = require('http');
const fs = require('fs').promises;
const server = http.createServer((req, res) => {
    fs.readFile('./index.html')
        .then((data) => {
            res.end(data);
        })
        .catch((err) => {
            console.error(err);
            res.statusCode = 500;
            res.end('Internal server error');
        });
});
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

let connections = [];

server.on('connection', (connection) => {
    connections.push(connection);
    connection.on('close', () => {
        const index = connections.indexOf(connection);
        if (index !== -1) {
            connections.splice(index, 1);
        }
    });
});

function closeConnections() {
    console.log('Closing all connections...');
    connections.forEach((connection) => {
        connection.end();
    });
    setTimeout(() => {
        connections.forEach((connection) => {
            connection.destroy();
        });
        server.close(() => {
            console.log('Server has been shut down.');
            process.exit();
        });
    }, 10000);
}

process.on('SIGINT', () => {
    console.log('Received SIGINT signal, shutting down server...');

    // 进行必要的清理工作
    console.log('Cleaning up...');
    fs.unlink('./index.html')
        .then(() => {
            console.log('File has been deleted.');
        })
        .catch((err) => {
            console.error(err);
        });

    // 关闭所有连接
    closeConnections();
});
Copier après la connexion

Dans le code ci-dessus, nous utilisons Promise pour lire le fichier afin de nous assurer que le fichier a été correctement supprimé avant de fermer le serveur. Avant d'arrêter le serveur, nous avons également fermé toutes les connexions et fermé de force toutes les connexions ainsi que le serveur après 10 secondes. En utilisation réelle, différents délais d'attente peuvent être définis selon les besoins.

3. Résumé
Dans les applications Node.js, l'arrêt du serveur Web est une exigence courante. Cet article décrit comment utiliser le module http intégré pour créer un serveur Web et arrêter le serveur en douceur en écoutant le signal SIGINT. Dans le même temps, nous avons également présenté comment optimiser le processus d'arrêt du serveur pour garantir que le serveur puisse s'arrêter correctement dans diverses circonstances. Dans les applications réelles, il peut être étendu et optimisé de manière appropriée selon les besoins pour répondre à différents besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!