Я изо всех сил пытался заставить это работать в течение дня, я надеюсь, что кто-то может помочь мне с какой-то основой, поскольку я пытался прочитать об этом без особого успеха.
Назначение приложения: мое приложение берет имя пользователя и пароль от пользователя, запускает модуль, который запускает puppeteer для автоматизации задач, предоставляя пользователю оперативные обновления о прогрессе puppeteer.
2 пользователя, подключенные одновременно, могут вводить разные учетные данные, и puppeteer должен работать одновременно, выводя прогресс для этого конкретного пользователя своей работы.
Я использую node.js + express + ejs + socket.io, созданный с помощью экспресс-генератора.
Структура файла выглядит следующим образом:
bin/
--www.js
app.js
scraper.js
views/
--index.js
routes/
--index.ejs
public/
...
У меня есть socket.io, работающий в модуле www.js
, где настроен сервер, я настроил, когда пользователь нажимает кнопку отправки на внешнем интерфейсе, socket.io выдает уникальное полученное сообщение (в www.js ) и вызывает функцию launchScraper
внутри scraper.js
.
Я хочу, чтобы launchScraper
затем отправлял живые обновления этому отдельному пользователю. то есть успешно вошли в систему, работа выполнена и т. д.
Вопрос: я не могу заставить scraper.js отправить сообщение этому уникальному пользователю (используя его socket.id
), я думаю, что упускаю какую-то теорию. Вот мой код:
www.js
const scraper = require('../scraper');
const socketio = require('socket.io');
...
const server = http.createServer(app);
const io = socketio(server);
...
io.on('connection', (socket) => {
console.log('New connection: '+ socket.id);
...
socket.on('launchScraper', (socket) =>{
console.log('received client launchScraper');
scraper.launchScraper(io,userCredentials);
})
scraper.js
const puppeteer = require('puppeteer');
//This emits the message to all users, but I've tried variations sending `socket.id` in etc and I cannot seem to get it to work.
function emitMessage(io,msg){
io.emit('message',msg);
console.log(msg);
}
async function launchScraper(io,userData) {
emitMessage(io, 'Launching Scraper...'); //Sending io in
const browser = await puppeteer.launch({..});
const page = await browser.newPage();
...
Может ли кто-нибудь помочь или предложить лучший способ сделать это? Я просто не хочу, чтобы на www.js было много кода, так как я не верю, что код должен там жить.
Я новичок в Node, и я изо всех сил пытаюсь понять экземпляры, конструкторы и т. д.