2016-07-14 8 views
1

Im kinda новый в узле и стек в течение длительного времени с этой ошибкой. Пожалуйста, помогите мне решить мою проблему. Вот мой код:Ошибка: не удается установить заголовки после их отправки. 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

Способы отправки ответа HTTP, такие как res.render(), могут вызываться только один раз за запрос (есть только один ответ на запрос). Когда вы вызываете их более одного раза, вы получаете сообщение об ошибке, которое уже отправлено.

Предполагая, что ваша 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

В экспресс метод визуализации(), отправить(), JSON() может вызвать один раз в ответ на клиента, второй Invoke будет испускать Ошибка: Не удается установить после их отправки. Из вашего кода res.render() вызывается много раз, потому что вы вызываете его внутри цикла. Лучше, если вы проверите, завершен ли ответ или нет, перед вызовом render(), или переработайте свою логику, чтобы вызвать render() только один.

+0

Это соответствующий ответ, как этот вопрос больше похож на «иметь в виду» вещь! – sahilabrar

0

Добавьте строку return false после res.render

Смежные вопросы