web-dev-qa-db-fra.com

NodeJS: Erreur d'écouter EADDRINUSE ::: 3000?


Je suis actuellement confronté à un bug que je ne peux pas résoudre et qui se débat pendant quelques heures.
J'utilise les versions suivantes:
Noeud: 8.11.3
Express: 4.16.3
Jest: 22.2.2
Mangouste: 5.2.3

J'essaie de faire quelques tests d'intégration avec jest et j'ai 2 fichiers avec des tests.
Dans chaque fichier, j'ai écrit ce qui suit:

// Create the server before each test
beforeEach(() => {
    server = require('../../index');
});

// Close the server after each test
afterEach(async () => {
    if (server) {
        server.close();
    }
});

Dans index.js j'ai ce qui suit (ce n'est pas tout le code, mais le code approprié pour le bogue):

// Listen to the server
const port = config.PORT || process.env.PORT || 3000;
module.exports = app.listen(port, () => {
   winston.info(`Listening to port ${port}...`);
});

Quand je lance npm test .__, je reçois cette exception tout le temps:

**listen EADDRINUSE :::3000**

  10 | // Listen to the server
  11 | const port = config.PORT || process.env.PORT || 3000;
> 12 | module.exports = app.listen(port, () => {
  13 |     winston.info(`Listening to port ${port}...`);
  14 | });
  15 |

J'ai essayé plusieurs façons de résoudre ce problème en ajoutant async await à beforeEach et pour afterEach et j'ai également essayé de mettre le paramètre sever.close dans afterAll et dans beforeAll, mais j'ai toujours la même erreur.

Ensuite, j'ai essayé de résoudre en faisant ceci:
Comment puis-je arrêter mon serveur Express en douceur lorsque son processus est tué?

Mais encore une fois, sans succès.
Enfin, lorsque j’ai écrit tous les tests dans 1 fichier, cela fonctionne sans cette error. Est-ce que quelqu'un sait comment résoudre ce problème? Je ne veux pas écrire tous mes tests d'intégration dans 1 fichier ..
Merci! 

2
OrAssayag

Essayez de définir le drapeau --runInBand, cela exécutera vos tests de manière séquentielle.

https://jestjs.io/docs/fr/cli#runinband

Dans les scripts package.json: 

"scripts": {
    ...
    "test": "jest --watchAll --verbose --runInBand",
    ...
}

[MISE À JOUR] Si vous souhaitez utiliser --runInBand pour exécuter vos tests de manière séquentielle, vous pouvez également attendre server.close (), car il renvoie une promesse. En tant que tel, dans votre aprèsEach: 

...
await server.close();
...
3
Nicholas Pretorius

Je pense que votre port 3000 est occupé ailleurs Ou peut-être que cette application est exécutée ailleurs dans le terminal, vérifiez-la et fermez toutes les instances de cette application.

Ou 

Essayez d'utiliser le code ci-dessous:

// Listen to the server
  11 | const port = config.PORT || process.env.PORT || 3001; // CHANGE POST 3000-> 3001
> 12 | module.exports = app.listen(port, () => {
  13 |     winston.info(`Listening to port ${port}...`);
  14 | });
0
Shubham Verma

Le problème ici nécessite le fichier de serveur plusieurs fois. Vous ne devriez pas avoir besoin d'un fichier serveur comme ça. Chaque fois que vous faites cela, une instance démarre, dans votre premier fichier de test, une instance de serveur est déjà démarrée, alors que le second fichier est requis, il essaie de démarrer une autre instance, mais votre serveur est déjà en cours d'exécution sur 3000, d'où l'erreur .

0
Sachin S