Pm2 не получает активные классы, как так?
Делаю проект, который работает с одним сайтом. Чтобы не ловить кд на авторизацию - решил сделать так: пусть один класс работает постоянно (аля сервер), а второй - класс который работает с этим первым классом - будет производить нужные действия, работая с первым. Погуглил. Такую хотелку можно сделать с помощью pm2.
Первый класс: авторизуется на сайте с помощью кукольника и держит вкладку открытой. При этом он содержит класс Session, который является сессией на сайте. У класса есть страница, на которой есть сессия - ее то и нужно получить, но из другого класса. Сам же файл (sessions.js) помимо класса содержит:
const puppeteer = require('puppeteer'); require('dotenv').config(); const account = {//data}; const sessions = []; class Session { ... } async function launch() { console.log('Sessions starting...'); sessions.push(new Session(account)); await sessions[0].init(); console.log('Sessions is ready!'); } module.exports = { getSessions: function () { return sessions; } }; if (sessions.length == 0) { // если это новый экземпляр, без сессий - инициализируем launch(); } |
const puppeteer = require('puppeteer'); require('dotenv').config(); const account = {//data}; const sessions = []; class Session { ... } async function launch() { console.log('Sessions starting...'); sessions.push(new Session(account)); await sessions[0].init(); console.log('Sessions is ready!'); } module.exports = { getSessions: function () { return sessions; } }; if (sessions.length == 0) { // если это новый экземпляр, без сессий - инициализируем launch(); }
Второй класс:
Второй класс не может подключить sessions, которая была запущена pm2 с помощью requere, так как это будет новый экземпляр файла, который создаст новую Session и ее инициализирует, а мне нужна та Session, которая храниться в файле sessions, запущенная pm2. Поэтому я это делаю так:
let active; pm2.connect(function(err) { if (err) { console.error(err); process.exit(2); } pm2.list(function(err, processes) { if (err) { console.error(err); pm2.disconnect(); return; } const sessionsScripts = processes.filter(process => process.name === 'sessions'); // получаем список активных файлов sessions.js, запущеных pm2 const activeSessions = sessionsScripts.map(session => session.pm2_env); active = activeSessions; // задаем в переменную вне функции pm2.connect console.log('Активные сессии:', activeSessions); pm2.disconnect(); }); }); async function main(){ for (let index = 0; index < 30; index++) { if (sessions != []) { break; // выйдем из цикла, только тогда, когда sessions будут прогружены с помощью pm2.connect } console.log('iterations ' + index); await sleep(6000); // ожидаем } await getNewMessages(active[0].getPage()); // просто чтобы проверить взялась ли нужная страница } async function sleep(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } main(); |
let active; pm2.connect(function(err) { if (err) { console.error(err); process.exit(2); } pm2.list(function(err, processes) { if (err) { console.error(err); pm2.disconnect(); return; } const sessionsScripts = processes.filter(process => process.name === 'sessions'); // получаем список активных файлов sessions.js, запущеных pm2 const activeSessions = sessionsScripts.map(session => session.pm2_env); active = activeSessions; // задаем в переменную вне функции pm2.connect console.log('Активные сессии:', activeSessions); pm2.disconnect(); }); }); async function main(){ for (let index = 0; index < 30; index++) { if (sessions != []) { break; // выйдем из цикла, только тогда, когда sessions будут прогружены с помощью pm2.connect } console.log('iterations ' + index); await sleep(6000); // ожидаем } await getNewMessages(active[0].getPage()); // просто чтобы проверить взялась ли нужная страница } async function sleep(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } main();
Но второй класс - создает новый экземпляр файла sessions.js, а не использует запущеный pm2. Что делать в таком случае?
Дополнительно:
Мой варинат - сохранять в кеше класс сессии. Но другой вопрос - как? Потому что куки сохранять и ставить на страницу - не вариант, тк сайт не колышит какие у страницы куки - страница все равно будет без входа
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы понять, почему pm2 не получает активные классы, необходимо рассмотреть несколько возможных причин и способов их решения:
1. Проверьте правильность настройки конфигурационного файла pm2. Убедитесь, что вы правильно указали пути к вашим классам и что они находятся в нужных директориях.
module.exports = { apps : [{ name: 'my-app', script: 'app.js', instances: 1, autorestart: true, watch: true, max_memory_restart: '1G', env: { NODE_ENV: 'development' }, env_production: { NODE_ENV: 'production' } }] };
2. Проверьте, что в ваших классах правильно определены активные классы. Убедитесь, что они имеют правильные свойства и методы для работы с pm2.
class MyClass { public function __construct() { // Конструктор класса } public function isActive() { return true; } }
3. Проверьте логи pm2 на наличие ошибок. Запустите pm2 с флагом `--no-daemon` и посмотрите вывод консоли на возможные ошибки при запуске ваших классов.
4. Убедитесь, что вы используете последнюю версию pm2. Возможно, проблема была исправлена в более новой версии.
Если после всех этих шагов проблема не решена, попробуйте создать минимальный пример кода, который воспроизводит проблему, и поделитесь им с сообществом, чтобы получить более точные рекомендации по ее решению.