Я хочу получить содержимое консоли текущего запущенного скрипта Node.js.
Я пытался сделать это событие, но оно не работает:
setInterval(function() { console.info("Hello World!") }, 1000);
process.stdout.on('message', (message) => {
console.info('stdout: ' + message.toString())
})
Он не прослушивает событие.
@Вади как? Я пытался установить таймер каждую секунду для отправки сообщения с помощью console.info, но это событие по-прежнему ничего не делает.
@gabudu с предоставленным только кодом, трудно сказать, почему он ничего не делает. Добавьте другие детали, связанные с таймером.
@Vadi я отредактировал его и добавил таймер
других частей пока нет
В сценарии, где это событие существует, этот код будет циклом. console.info запускает message, где вы вызываете console.info, который вызывает сообщение... Чего вы пытаетесь достичь?
@MarcosCasagrande - я хочу сделать GET в моем приложении Express.js с именем /getconsole .. он должен вернуть консоль текущего запущенного сценария Node.js (который также запускает приложение Express.js)
Лучшим подходом является использование пользовательского регистратора, такого как winston. Где вы даже можете испускать в сокет и получать вывод сценария Node.js в реальном времени.





stdout при переходе к tty (терминалу) является экземпляром доступный для записи поток. То же самое и с stderr, на который узел пишет сообщения об ошибках. Эти потоки не имеют событий сообщений. Метод on() позволяет запросить любое именованное событие, даже такое, которое никогда не сработает.
Ваше требование не ясно из вашего вопроса. Если вы хотите перехватывать и проверять операции console.info, вы можете направить stdout в какой-либо другой поток. Точно так же вы можете направить stderr в какой-либо другой поток для перехвата и проверки ошибок.
Или, в порыве уродства и плохой ремонтопригодности, вы можете переопределить функции console.info и console.error так, чтобы они делали то, что вам нужно.
Похоже, вы хотите буферизовать материал, записанный на консоль, а затем вернуть его http-клиенту в ответ на операцию GET. Для этого вы либо
прекратите использовать console.info для этого вывода и переключитесь на высококачественный пакет npm для ведения журнала, такой как winston.
переопределить console.info (и, возможно, console.error), чтобы сохранить его вывод в какой-то простой структуре данных экспресс-приложения, возможно, в массиве строк. Затем реализуйте свой GET, чтобы прочитать этот массив строк, отформатировать его и вернуть.
Мое первое предложение более масштабируемо.
Кстати, подумайте о последствиях для безопасности, если ваш консольный журнал будет доступен злоумышленникам.
Что, если я хочу также получить ошибки Node.js (которые хранятся в консоли)?
На process.stdout нет события «сообщение».
I want to make a GET in my Express.js app called /getconsole .. it should return the console of the current running Node.js script (which is running the Express.js app too)
Что вам следует использовать, так это настраиваемый регистратор, я рекомендую Уинстон с передачей файлов, и тогда вы сможете читать из этого файла, когда отправляете запрос на свою конечную точку.
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.info 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);
Вы также можете использовать соединение через веб-сокет и создать собственный транспорт winston для отправки журналов.
Это не полностью решение Node.js, но оно очень хорошо, если вы используете Linux.
Создайте файл start.sh.
Поместите в него следующее:
start.sh:
#!/bin/bash
touch ./console.txt
node ./MyScript.js |& tee console.txt &
wait
MyScript.js) и используйте это событие Express.js:MyScript.js:
const fs = require('fs');
app.get('/console', function(req, res){
var console2 = fs.readFileSync("./console.txt", 'utf8');
res.send(console2);
});
start.sh.Теперь вызов http://example.com/console должен вывести консоль!
Была использована часть этот ответ.
ПРИМЕЧАНИЕ: чтобы отформатировать разрывы строк вывода консоли, чтобы они правильно отображались в браузерах, вы можете использовать модуль, например nl2br.
Совет: Проблемы не всегда решаются прямым путем, большинство проблем решается косвенными путями. Продолжайте искать возможные способы достижения того, чего вы хотите, и не ищите только то, что вы ищете.
Использовать readFileSync на экспресс-маршруте неправильно. Помимо блокировки цикла событий, если файл слишком велик, вы получите сообщение об ошибке нехватки памяти, что приведет к сбою сервера. Вы должны использовать fs.createReadStream и направить его на res.
возможно, это событие не срабатывает