【问题标题】:async / await with socket.io异步 / 等待 socket.io
【发布时间】:2020-09-04 12:43:14
【问题描述】:

此代码将第一个发射发送到客户端,客户端获取消息开始:'作业正在开始...' 这没关系。 之后,代码启动 puppeteer 并制作屏幕截图 example.png。这也可以。 但是第二次发射没有被触发,也没有发送给客户端。 在我得到的服务器的 console.log 中:

  • 工作开始
  • 捕获完成
  • 工作已完成

这也可以。

发生了什么?为什么第二次发射没有触发?

const express = require('express');
const puppeteer = require('puppeteer')
const app = express();
const server = app.listen(3000);

app.set('view engine', 'ejs');
var io = require('socket.io').listen(server);

app.get('/', function (req, res, next) {
  res.render('index');
});

app.get('/scan', function (req, res, next) {
  console.log('job is starting');

  io.sockets.on('connection', function (socket) {
    socket.emit('messageStart', 'Job is starting...');
  });

  (async () => {
    const browser = await puppeteer.launch({headless:false});
    const page = await browser.newPage();
    await page.goto('https://example.com');
    await page.screenshot({ path: 'example.png' });
    await browser.close();
    console.log('CAPTURE FINISHED');
  })().then(()=>{
      console.log('job is finished');

      io.sockets.on('connection', function (socket) {
          socket.emit('messageEnd', 'Job is done!');
        });
    });
  res.render('scan');
});

【问题讨论】:

    标签: javascript node.js express async-await puppeteer


    【解决方案1】:

    这里是基于 Md. Abu Taher 代码的完整代码:

    const scanner = async () => {
        // emit this message when the scan really starts
        io.sockets.on('connection', function (socket) {
            io.emit('messageDoing', 'Doing the Job ...');
        });
        const browser = await puppeteer.launch({ headless: false });
        const page = await browser.newPage();
        await page.goto('https://example.com');
        await page.screenshot({ path: 'example.png' });
        await browser.close();
        console.log('CAPTURE FINISHED');
    };
    
    app.get('/scan', async function (req, res, next) {
        // emit to all clients on start
        console.log('job is starting');
        io.sockets.on('connection', function (socket) {
            io.emit('messageStart', 'Job is starting...');
        });
    
        // do the actual stuff
        await scanner();
    
        // emit to all clients on finish
        console.log('job is finished');
        io.sockets.on('connection', function (socket) {
            io.emit('messageEnd', 'Job is done...');
        });
        res.render('scan')
    });
    

    【讨论】:

    • 你每次都在添加连接事件,长期下去会出问题。尝试删除它们。
    • 我明白,但是当我删除 io.sockets.on('connection', 时,什么都没有发出。工作完成了,但客户什么也没收到
    【解决方案2】:

    你需要监听一次连接并发送到套接字两次。

    const scanner = async () => {
      const browser = await puppeteer.launch({headless:false});
      const page = await browser.newPage();
      await page.goto('https://example.com');
      await page.screenshot({ path: 'example.png' });
      await browser.close();
      console.log('CAPTURE FINISHED');
    }
    
    app.get('/scan', async function (req, res, next) {
      // emit to all clients on start
      console.log('job is starting');
      io.emit('messageStart', 'Job is starting...');
    
      // do the actual stuff
      await scanner();
    
      // emit to all clients on finish
      console.log('job is finished');
      io.emit('messageEnd', 'Job is done!');
    
      res.render('scan');
    });
    

    【讨论】:

    • 谢谢您,先生,您的回答对我有帮助。但它并没有完全发挥作用。我在 io.emit('messageStart'...再次感谢您节省我的时间。我将发布完整的以下代码。希望它可以帮助其他人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2016-07-07
    • 2016-03-25
    • 2017-10-09
    • 2021-10-22
    相关资源
    最近更新 更多