2017-11-10 4 views
1

私は、ポストリクエストを持つExpressセットアップを持っています。私は(async (req, res)reqを追加しようとしました:self-called async関数の中に引数を挿入するには?

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) 
    })() 
}) 

はしかし、私はまだ、このエラーを取得しています:

(node:5757) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Evaluation failed: ReferenceError: req is not defined at :2:32

これを行うための適切な方法は何ですか?

答えて

3

あなたのリンター(もしあれば)は、あなたがそのIIFEのシャドーイング変数であると訴えていたはずです。私はそれではなく、自身の影の空VARSのルータからreqresを使用するために

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) 
    })() 
}) 

としてそれを書き換えると思います。

2

この行;(async (req, res) => {は単なる関数定義である

機能と呼ばれる自己を起動しているときには、値を渡す必要があるので、あなたはreqresを受け入れる関数を定義しているが、あなたが実際に値を渡しませんでした呼び出されたときに自己呼び出し関数を呼び出します。

自己が起動するので、あなたのケースで、あなただけの機能からパラメータを削除することができますまた、このライン})(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. 
}) 


を関数を呼び出している間、私はちょうどパラメータとして両方reqresを追加しました下のコードを確認してください

:機能はまだだからあなたのコードになるだろうそれを含む機能 reqres

へのアクセス権を持っています

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) 
    })(); 
}) 
関連する問題