Делаю проект, который работает с одним сайтом. Чтобы не ловить кд на авторизацию - решил сделать так: пусть один класс работает постоянно (аля сервер), а второй - класс который работает с этим первым классом - будет производить нужные действия, работая с первым. Погуглил. Такую хотелку можно сделать с помощью 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. Что делать в таком случае?