Использование Socket.io в другом модуле (Node.js)

Я изо всех сил пытался заставить это работать в течение дня, я надеюсь, что кто-то может помочь мне с какой-то основой, поскольку я пытался прочитать об этом без особого успеха.

Назначение приложения: мое приложение берет имя пользователя и пароль от пользователя, запускает модуль, который запускает 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, и я изо всех сил пытаюсь понять экземпляры, конструкторы и т. д.


person Nik S    schedule 11.07.2020    source источник


Ответы (1)


Оказывается, мне нужно было отправить сокет с моим запросом, а не экземпляр io.

Это, казалось, решило это.

person Nik S    schedule 12.07.2020