如何在一个自称的asynchronous函数内插入一个参数?
我有一个快速安装与发布请求。 我试图添加req
(async (req, res)
:
router.post('/search', (req, res) => { ;(async (req, res) => { const browser = await puppeteer.launch() const page = await browser.newPage() await page.goto(`https://www.google.com/search?tbm=bks&q=%22this+is%22`) const result = await page.evaluate(() => { console.log('CLAUSESS:', req.body.clauses) const clauses = req.body.clauses return clauses.map(clause => clause.textContent) }) result.join('\n') await browser.close() res.send(result) })() })
但是,我仍然得到这个错误:
(节点:5757)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):错误:评估失败:ReferenceError:req未在以下位置定义:2:32
什么是这样做的正确方法?
你的棉绒(如果有的话)应该抱怨你在IIFE上隐藏了variables。 我会重写它
router.post('/search', (req, res) => { ;(async () => { const browser = await puppeteer.launch() const page = await browser.newPage() await page.goto(`https://www.google.com/search?tbm=bks&q=%22this+is%22`) const result = await page.evaluate(() => { console.log('CLAUSESS:', req.body.clauses) const clauses = req.body.clauses return clauses.map(clause => clause.textContent) }) result.join('\n') await browser.close() res.send(result) })() })
使它使用req
和res
从路由器,而不是自己的阴影空虚。
您应该调用自调用函数来传递值
这一行;(async (req, res) => {
就是函数定义,所以你定义了一个函数来接受req
和res
但是实际上并没有把这些值传递给自调函数。
检查下面的代码,我刚刚添加req
和res
作为参数,而调用函数这一行})(req,res);
router.post('/search', (req, res) => { ;(async (req, res) => { //req and res here are just parameters in function definition const browser = await puppeteer.launch() const page = await browser.newPage() await page.goto(`https://www.google.com/search?tbm=bks&q=%22this+is%22`) const result = await page.evaluate(() => { console.log('CLAUSESS:', req.body.clauses) const clauses = req.body.clauses return clauses.map(clause => clause.textContent) }) result.join('\n') await browser.close() res.send(result) })(req,res); //This is where we call the function, so we need to pass the actual values here. })
或者在你的情况下,你可以从函数中删除参数,因为自调用函数仍然可以访问它的包含函数req
和res
所以你的代码将变成:
router.post('/search', (req, res) => { ;(async () => { //removed parameters from function definition as they are already accessible from containing function const browser = await puppeteer.launch() const page = await browser.newPage() await page.goto(`https://www.google.com/search?tbm=bks&q=%22this+is%22`) const result = await page.evaluate(() => { console.log('CLAUSESS:', req.body.clauses) const clauses = req.body.clauses return clauses.map(clause => clause.textContent) }) result.join('\n') await browser.close() res.send(result) })(); })