2017-11-10 4 views
1

게시물 요청과 함께 빠른 설정이 있습니다. 나는 (async (req, res)req을 추가하려고 :자체 호출 된 비동기 함수에 인수를 삽입하는 방법은 무엇입니까?

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

이 일을 적절한 방법은 무엇입니까 :

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

그러나 나는 아직도이 오류를 받고 있어요?

답변

3

귀하의 린터 (해당하는 경우)는 해당 IIFE의 섀도 잉 변수라고 불평해야합니다. 내가 대신 자신의 그림자 빈 바르의 라우터에서 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) 
    })(); 
}) 
관련 문제