NodeJS response.write внутри обратного вызова - PullRequest
2 голосов
/ 22 ноября 2011

Я использую маршрут для обработки URL.Функции запускаются, как и ожидалось.То, что я пытаюсь сделать, это использовать response.write () внутри обратного вызова.Я понимаю, что это не работает, потому что обратный вызов не имеет доступа к тем же переменным, что и вызывающая его функция, но мне интересно, каким будет правильный способ NODE сделать это.

route.post('/{type}subject/{method}', function (request,response) {
var post = "";
request.on('data', function (chunk){
    post += chunk;
});
request.on('end', function (){
    postData = qs.parse(post);
    response.writeHead(200);
    switch(request.params['method'].toLowerCase())
    {
        case "registerobserver":
            if (postData['uri']){
                registerObserver (request.params['type'], postData['uri']);
                response.write(success("registerobserver"));
            }
            else
                response.write(failure("1","uri undefined"));

            break;
        case "unregisterobserver":
            if (postData['uri']){
                client.query ('DELETE observers FROM observers INNER JOIN type ON (observers.TypeID = type.TypeID) WHERE observers.uri ="'+postData['uri']+'" AND type.name = "'+request.params['type']+'"', 
                function(err, info) 
                {
                    if(err){
                        response.write(failure("2", "general database failure"));}
                    else{   
                    if(info.affectedRows != 0)
                        response.write(success("unregisterobserver")); //this code does not trigger a response due to namespace

                    else
                        response.write(failure("1", "uri not an observer"));//this code does not trigger a response
                        console.log("uri not observer");
                    }

                    console.log("done");
                })

            }
            else
                response.write(failure("1","uri required"));

            break;
        default:

    }

    response.end();
})
//response.write("type: "+request.params['type']+"<br/>method="+request.params['method']);

});

function success(method){return "<?xml version=\"1.0\"?>\n<response stat=\"ok\">\n\t<method>"+method+"</method>\n</response>";}
function failure(code, message){return "<?xml version=\"1.0\"?>\n<response stat=\"fail\">\n\t<err code=\""+code+"\" msg = \""+message+"\" />\n</response>";}

1 Ответ

7 голосов
/ 22 ноября 2011

В основном происходит то, что асинхронная query функция-обработчик будет вызываться после вашего response.end() вызова функции. Как таковая любая запись не удастся.

Вам нужно вместо этого вызвать обратный вызов response.end() и позаботиться о том, чтобы иначе не вызывать response.end(), если вы находитесь в пути асинхронного кода. То есть. return сразу после client.query() вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...