Je souhaite obtenir le contenu de la console du script Node.js en cours d'exécution.

J'ai essayé de faire cet événement mais cela ne fonctionne pas:

setInterval(function() { console.log("Hello World!") }, 1000);

process.stdout.on('message', (message) => {
    console.log('stdout: ' + message.toString())
})

Il n'écoute pas l'événement.

2
gabugu 27 janv. 2019 à 18:02

3 réponses

Meilleure réponse

Ce n'est pas une solution entièrement Node.js mais c'est très bien si vous exécutez Linux.

  1. Créez un fichier start.sh.

  2. Mettez-y les éléments suivants:

start.sh:

#!/bin/bash
touch ./console.txt
node ./MyScript.js |& tee console.txt &

wait
  1. Ouvrez maintenant votre script Node.js (MyScript.js) et utilisez cet événement Express.js:

MyScript.js:

const fs = require('fs');
app.get('/console', function(req, res){
    var console2 = fs.readFileSync("./console.txt", 'utf8');
    res.send(console2);
});
  1. Démarrez toujours votre application Node.js en appelant start.sh

L'appel à http://example.com/console devrait afficher la console!

  • Une partie de cette réponse a été utilisée.

  • REMARQUE : pour formater correctement les sauts de ligne de la sortie de la console dans les navigateurs, vous pouvez utiliser un module comme nl2br.

  • Un conseil : les problèmes ne sont pas toujours résolus de manière directe, la plupart des problèmes sont résolus de manière indirecte. Continuez à chercher les moyens possibles d'atteindre ce que vous voulez et ne cherchez pas uniquement ce que vous recherchez.

1
MatrixCow08 27 janv. 2019 à 19:00

stdout, lors du passage à un tty (terminal) est une instance d'un flux inscriptible. Il en va de même pour stderr, sur lequel le nœud écrit des messages d'erreur. Ces flux n'ont pas d'événements de message. La méthode on() permet la sollicitation de tout événement nommé, même ceux qui ne se déclencheront jamais.

Votre exigence ne ressort pas clairement de votre question. Si vous souhaitez intercepter et inspecter les opérations console.log, vous pouvez diriger stdout vers un autre flux. De même, vous pouvez diriger stderr vers un autre flux pour intercepter et inspecter les erreurs.

Ou, dans une explosion de laideur et de mauvaise maintenabilité, vous pouvez redéfinir les fonctions console.log et console.error en quelque chose qui fait ce dont vous avez besoin.

Il semble que vous vouliez mettre en mémoire tampon le matériel écrit sur la console, puis le renvoyer à un client http en réponse à une opération GET. Pour ce faire, vous feriez soit

  1. arrêtez d'utiliser console.log pour cette sortie et passez à un package npm de journalisation de haute qualité comme winston.

  2. redéfinissez console.log (et éventuellement console.error) pour enregistrer sa sortie dans une sorte de structure de données simple à portée d'application express, peut-être un tableau de chaînes. Ensuite, implémentez votre GET pour lire ce tableau de chaînes, le formater et le renvoyer.

Ma première suggestion est plus évolutive.

En passant, veuillez considérer les implications de sécurité de la mise à disposition du journal de votre console à des inconnus malveillants.

0
O. Jones 27 janv. 2019 à 16:06

Il n'y a pas d'événement "message" sur process.stdout.

Je veux créer un GET dans mon application Express.js appelée / getconsole .. il devrait renvoyer la console du script Node.js en cours d'exécution (qui exécute également l'application Express.js)

Ce que vous devez utiliser est un enregistreur personnalisé, je recommande winston avec un transport de fichier, puis vous pouvez lire à partir de ce fichier lorsque vous émettez une demande à votre point de terminaison.

const express = require('express');
const fs = require('fs');
const winston = require('winston');
const path = require('path');

const logFile = path.join(__dirname, 'out.log');
const app = express();

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [
        new winston.transports.Console({
            format: winston.format.simple()
        }),
        new winston.transports.File({
            filename: logFile
        })
    ]
});


// Don't use console.log anymore.
logger.info('Hi');


app.get('/console', (req, res) => {
    // Secure this endpoint somehow
    fs.createReadStream(logFile)
        .pipe(res);
});

app.get('/log', (req, res) => {
    logger.info('Log: ' + req.query.message);
});

app.listen(3000);

Vous pouvez également utiliser une connexion websocket et créer un transport winston personnalisé pour émettre les journaux.

1
Marcos Casagrande 27 janv. 2019 à 15:44