Задать вопрос
@Gera01
Unity, С# и больше ничего.

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();
}

Второй класс:
Второй класс не может подключить 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();


Но второй класс - создает новый экземпляр файла sessions.js, а не использует запущеный pm2. Что делать в таком случае?
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Сложный 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы