Node.JS: Как можно узнать что ответ клиенту уже послан или посылается
Добрый день. Возможно заголовок вопроса не совсем понятный, поэтому объясню на примере:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .javascript.geshi_code {font-family:monospace;} .javascript.geshi_code .imp {font-weight: bold; color: red;} .javascript.geshi_code .kw1 {color: #000066; font-weight: bold;} .javascript.geshi_code .kw2 {color: #003366; font-weight: bold;} .javascript.geshi_code .kw3 {color: #000066;} .javascript.geshi_code .co1 {color: #006600; font-style: italic;} .javascript.geshi_code .co2 {color: #009966; font-style: italic;} .javascript.geshi_code .coMULTI {color: #006600; font-style: italic;} .javascript.geshi_code .es0 {color: #000099; font-weight: bold;} .javascript.geshi_code .br0 {color: #009900;} .javascript.geshi_code .sy0 {color: #339933;} .javascript.geshi_code .st0 {color: #3366CC;} .javascript.geshi_code .nu0 {color: #CC0000;} .javascript.geshi_code .me1 {color: #660066;} .javascript.geshi_code span.xtra { display:block; }
var server = require('http').createServer();
var requestListener1 = function(request, serverResponse) {
console.log('before', serverResponse.statusCode);
serverResponse.writeHead(404);
serverResponse.end();
console.log('after', serverResponse.statusCode);
}
var requestListener2 = function(request, serverResponse) {
console.log('before2', serverResponse.statusCode);
serverResponse.writeHead(200);
serverResponse.end();
console.log('after2', serverResponse.statusCode);
}
server.on('request', requestListener1);
server.on('request', requestListener2);
server.listen(81, "127.0.0.1");
Допустим requestListener1 обрабатывает обычные урл запросы вроде /news/show/14
requestListener2 занимается файлами robots.txt, favicon.ico и т.д.
Мне необходимо решить проблему чтобы requestListener1 не работал на запросом, если за него уже взялся requestListener2 и наоборот. Вот в этом вопрос. Т.е. как можно узнать что ответ клиенту для этого запроса уже послан.
Или это неправильный подход и проверять надо все в одном обработчике?
Результат:
Проблему возможно решила бы переменна serverResponse.statusCode, но она почему то по умолчанию 200 = OK, что плохо :(
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .javascript.geshi_code {font-family:monospace;} .javascript.geshi_code .imp {font-weight: bold; color: red;} .javascript.geshi_code .kw1 {color: #000066; font-weight: bold;} .javascript.geshi_code .kw2 {color: #003366; font-weight: bold;} .javascript.geshi_code .kw3 {color: #000066;} .javascript.geshi_code .co1 {color: #006600; font-style: italic;} .javascript.geshi_code .co2 {color: #009966; font-style: italic;} .javascript.geshi_code .coMULTI {color: #006600; font-style: italic;} .javascript.geshi_code .es0 {color: #000099; font-weight: bold;} .javascript.geshi_code .br0 {color: #009900;} .javascript.geshi_code .sy0 {color: #339933;} .javascript.geshi_code .st0 {color: #3366CC;} .javascript.geshi_code .nu0 {color: #CC0000;} .javascript.geshi_code .me1 {color: #660066;} .javascript.geshi_code span.xtra { display:block; }
var server = require('http').createServer();
var requestListener1 = function(request, serverResponse) {
console.log('before', serverResponse.statusCode);
serverResponse.writeHead(404);
serverResponse.end();
console.log('after', serverResponse.statusCode);
}
var requestListener2 = function(request, serverResponse) {
console.log('before2', serverResponse.statusCode);
serverResponse.writeHead(200);
serverResponse.end();
console.log('after2', serverResponse.statusCode);
}
server.on('request', requestListener1);
server.on('request', requestListener2);
server.listen(81, "127.0.0.1");
Допустим requestListener1 обрабатывает обычные урл запросы вроде /news/show/14
requestListener2 занимается файлами robots.txt, favicon.ico и т.д.
Мне необходимо решить проблему чтобы requestListener1 не работал на запросом, если за него уже взялся requestListener2 и наоборот. Вот в этом вопрос. Т.е. как можно узнать что ответ клиенту для этого запроса уже послан.
Или это неправильный подход и проверять надо все в одном обработчике?
Результат:
before 200
after 404
before2 404
after2 200
before 200
after 404
before2 404
after2 200
before 200
after 404
before2 404
after2 200
Проблему возможно решила бы переменна serverResponse.statusCode, но она почему то по умолчанию 200 = OK, что плохо :(
1 ответов
Я не спец в node.js, более того я не разу на нем не писал, но сегодня как раз начал читать для чайников. И что могу сказать по вашему вопросу, вы сейчас создали две точки входа в программу, таким образом все запросы будут обрабатываться по два раза. Вам нужно оставить одну функцию и в зависимости от request ( /news/show/14, robots.txt, favicon.ico и т.д.) строить дальше логику приложения. Ответ не претендует на правильность, это мое личное мнение, основанное на знаниях прочитанных буквально пару часов назад ...
Обработчики на одно событие вызываются в порядке назначения.
Только по вашему коду совсем непонятно что происходит. На один и тот же реквест идёт две обработки. Я так понимаю пример не полный.
var server = require('http').createServer();
server.on('request', function(request, serverResponse) {
var requestFile = request.url;
fs.exists(requestFile, function(exists){
if (exists) {
server.emit('file', serverResponse, requestFile);
return;
}
dispatcher.serverResponse(serverResponse);
dispatcher.dispatch(request);
});
});
server.on('file', function(serverResponse, requestFile){
fileSystem.serveFile(serverResponse, requestFile);
});