首页 > 解决方案 > 无法在 express 中运行异步函数,如何解决?

问题描述

异步函数不在 express 视图、控制台日志、函数之前和之后运行,单独的代码工作,但 express 不运行。

const path = require('path')
const fs = require('fs')
const puppeteer = require('puppeteer');
const express = require('express');
const bodyParser = require('body-parser');

const app = express()
const port = 9596;
app.use(bodyParser.json());
  
app.post('/', async function(req, res){
    siteName = req.body.siteName;
    links = req.body.links;
    screenshotPageSource = req.body.screenshotPageSource;

    await createScreenshots(siteName, links, screenshotPageSource);
    
    res.end('Hello World!');
});
  
  app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`)
  })


async function createScreenshots(siteName, links, screenshotPageSource){

    const browser = await puppeteer.launch({defaultViewport: { width: 1366, height: 768 }});
    const page = await browser.newPage();

    linksLength = links.Length;

    for (var i = 0; i < linksLength; i++) {
        link = links[i]
        if(screenshotPageSource){
            currentLink = `view-source:${link}`;
        } else {
            currentLink = link;
        }
    
        pageNumber = i + 1;
        
        console.log(pageNumber);

        await page.goto(currentLink, {waitUntil: 'load', timeout: 60000}).then(() => {
            console.log(`Страница ${pageNumber}/${linksLength}, удалось сделать скриншот.`)
        }).catch((res) => {
            console.log(`Страница ${pageNumber}/${linksLength}, не удалось сделать скриншот.`)
        });
        await page.screenshot({ path: `${siteName}__${pageNumber}.png` });
    }
    
    await browser.close();
    return links;
};

看起来您的帖子主要是代码;请添加更多详细信息。看起来您的帖子主要是代码;请添加更多详细信息。看起来您的帖子主要是代码;请添加更多细节。

标签: javascriptexpress

解决方案


我猜的问题在app.post.

下面添加了一个代码供您参考,这可能有助于您编辑代码。

app.post('/', async(req, res, next) => { 
    const { error } = validateBody(req.body);

    if (error) {
        return res.status(400).send(error.details[0].message);
    }    
    const newData= new createScreenshots({ 
    siteName = req.body.siteName;
    links = req.body.links;
    screenshotPageSource = req.body.screenshotPageSource; });    


await newData.save();
    console.log('saving the document');
    res.send(newData);
})

以上代码仅供您参考如何编写app.post()


推荐阅读