2016-07-14 49 views
1

林有點新的節點和堆棧很長一段時間,這個錯誤。請幫我解決我的問題。 這裏是我的代碼:錯誤:發送後無法設置標題。 Express.js

app.get('/', function(req , res){ 
request(url, function(err, response, html){ 
if (!err && response.statusCode == 200){ 
    var page = cheerio.load(html); 
    page('.search-result-description').each(function(){ 
    var data = []; 
    var name = page(this).find('.search-result-item__head'); 
    var company = page(this).find('.search-result-item__company'); 
    var description = page(this).find('.search-result-item__snippet'); 
    var requirements = page(this).find('.search-result-item__snippet'); 
    var salary = page(this).find('.b-vacancy-list-salary'); 

    data.push({ 
     vac_name: name.eq(0).text(), 
     vac_description: description.eq(0).text(), 
     vac_requirements: requirements.eq(0).text(), 
     var_company: company.eq(0).text(), 
     vac_salary : salary.eq(0).text() 
    }); 
    data = JSON.stringify(data, null, 4); 
    res.render('main.ejs', {data: data}); 
    }); 
    } 
}); 
}); 

回答

6

發送類似於res.render()的http響應的方法只能在每個請求中調用一次(每個請求只有一個響應)。當您多次呼叫它們時,您會收到有關已被髮送的標題的錯誤消息。

假設你page()功能是同步的,你只需要在循環結束之後,而不是在箱內循環移動幾個報表和過於移動你的外循環的data變量的聲明,以便您可以用循環積累數據:

app.get('/', function(req, res) { 
    request(url, function(err, response, html) { 
     if (!err && response.statusCode == 200) { 
      var page = cheerio.load(html); 
      var data = []; 
      page('.search-result-description').each(function() { 
       var name = page(this).find('.search-result-item__head'); 
       var company = page(this).find('.search-result-item__company'); 
       var description = page(this).find('.search-result-item__snippet'); 
       var requirements = page(this).find('.search-result-item__snippet'); 
       var salary = page(this).find('.b-vacancy-list-salary'); 

       data.push({ 
        vac_name: name.eq(0).text(), 
        vac_description: description.eq(0).text(), 
        vac_requirements: requirements.eq(0).text(), 
        var_company: company.eq(0).text(), 
        vac_salary: salary.eq(0).text() 
       }); 
      }); 
      res.render('main.ejs', { 
       data: JSON.stringify(data, null, 4); 
      }); 
     } 
    }); 
}); 

你也應該有一些錯誤處理,如果request()操作返回一個錯誤。正如它所表達的那樣,你只是從不迴應請求。

+0

非常感謝,它完全解決了這個問題。 –

6

在快遞,方法渲染(),send()方法,JSON()一次可以調用來響應客戶端,第二個調用將發出錯誤:無法設置標題發送後。從你的代碼中,res.render()被調用了很多次,因爲你在循環中調用它。在調用render()之前檢查響應是否完成會更好,或者重寫邏輯以僅調用render()。

+0

這是一個合適的答案,這個問題更像是「牢記」之後的事情! – sahilabrar

0

添加行return falseres.render

相關問題