2015-01-12 10 views
0

Я продолжаю получать эту ошибку: Ошибка: не удается установить заголовки после их отправки.Почему? Ошибка: не удается установить заголовки после их отправки.

Я прочитал другие сообщения, но я не понимаю. У меня нет двойных обратных вызовов или чего-то еще. Где в моем коде возникает эта ошибка?

 
Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (http.js:689:11) 
    at ServerResponse.header (/root/node_modules/express/lib/response.js:666:10) 
    at ServerResponse.send (/root/node_modules/express/lib/response.js:146:12) 
    at fn (/root/node_modules/express/lib/response.js:900:10) 
    at View.exports.renderFile [as engine] (/root/node_modules/jade/lib/jade.js:330:12) 
    at View.render (/root/node_modules/express/lib/view.js:93:8) 
    at EventEmitter.app.render (/root/node_modules/express/lib/application.js:530:10) 
    at ServerResponse.res.render (/root/node_modules/express/lib/response.js:904:7) 
    at Query. (/root/tutsplus/server4.js:25:7) 
    at Query.emit (events.js:98:17) 
var express = require('express'), app = express(); 
var mysql = require('mysql'); 

app.get('/', function(req,res) { 

    var connection = mysql.createConnection({ 
     host: 'localhost', 
     user: 'root', 
     password: 'fuck', 
     database: 'store' 
    }); 

    var query = connection.query('SELECT * from category'); 

    query.on('result', function(row) { 

     var category = row.category_name; 

     res.render('fuck.jade', { 
      category: category 
     }); 
    }); 

}); // app.get 

app.listen(80, function() { 

    console.log('we are logged in'); 
}); 
+0

Эта конкретная ошибка почти всегда из-за неправильного обращения с асинхронными операциями, которые вызывают вещи, чтобы быть из последовательности отправки ответа , – jfriend00

+0

В моем коде есть что-то, что вызывает эту проблему? Где я должен искать? – user3658794

+0

Просьба отправить трассировку стека ошибки ('error.stack'). – Dai

ответ

2

Как я уже сказал в своем комментарии, эта проблема почти всегда вызывается неправильным обращением асинхронных операций, который вызывает куски ответа называть по порядку.

За примере here кода, который использует .on(), вы должны закончить только запрос, когда вы получите:

query.on('end', function() { 
    // all rows have been received 
}); 

Я думаю, что вы, вероятно, вызывая res.render() несколько раз, потому что вы вызываете его в query.on('result', ...) довольно чем в query.on('end', ....) после того, как все данные были собраны.

Тот факт, что вы делаете это в:

query.on('result', ...) 

, вероятно, неправильный вопрос времени вызывает проблему.


Из документации соединителя MySQL nodejs, вот пример:

var query = connection.query('SELECT * FROM posts'); 
query 
    .on('error', function(err) { 
    // Handle error, an 'end' event will be emitted after this as well 
    }) 
    .on('fields', function(fields) { 
    // the field packets for the rows to follow 
    }) 
    .on('result', function(row) { 
    // Pausing the connnection is useful if your processing involves I/O 
    connection.pause(); 

    processRow(row, function() { 
     connection.resume(); 
    }); 
    }) 
    .on('end', function() { 
    // all rows have been received 
    }); 
+0

OP изменил свой Q, чтобы удалить вызов 'res.end()'. – Dai

+0

@ Дай - трудно не отставать от меняющегося вопроса. Еще одна проблема заключается в том, что они не должны вызывать 'res.render()' до тех пор, пока все данные не будут получены. Главное, что нужно собрать все данные, а затем, когда все данные будут получены, они могут создать ответ с помощью 'res.render()'. – jfriend00

+0

@Dai 'result' испускается для каждой строки. Если существует более одной строки, 'res.render()' будет вызываться несколько раз. – mscdex

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