2013-06-16 12 views
1

Работала над веб-службой Node.js, которая размещается на OpenShift. В настоящее время у меня есть успех с помощью простых вызовов методов и т. Д., Но, похоже, не может заставить HTTP-ответ работать через асинхронный обратный вызов.Node.js Проблемы с обратным вызовом

Вот что я в настоящее время:

var http = require("http"); 
var url = require("url"); // used to get the requested method name as well as parameters 
var util = require("util"); 

// global variables 


// router function 
function route(pathname, query, callbackFunc) { 
    //return executeMethod(pathname, query); 
    var returnValue; 

    switch (pathname.toUpperCase()) { 
    case "/ADD": 
     returnValue = add(query['num1'], query['num2']); 
     //util.process.nextTick(function() { 
     //callbackFunc(null, returnValue); 
     //}); 
     break; 
    case "/ADDASYNC": 
     //addAsync(query['num1'], query['num2'], callback); 
     break; 
    default: 
     returnValue = "method not found"; 
     break; 
    } 

    //return returnValue; 
    //return "Route for request " + pathname + " complete, query: " + query; 
} 


// actual web method execution 
function add(num1, num2){ 
    //return "add method called with values: " + num1 + " " + num2; 
    return parseFloat(num1) + parseFloat(num2); 
} 

function addAsync(num1, num2, callback){ 
    //util.process.nextTick(function(){ 
    // var value = parseFloat(num1) + parseFloat(num2); 
    // util.process.nextTick(function(){ 
    //  callback(value); 
    // }); 
    //}); 
} 

// main request handler for server 
function onRequest(request, response) { 
    var pathname = url.parse(request.url).pathname; 
    var query = url.parse(request.url, true).query; 
    console.log("Request for " + pathname + " Recieved"); 

    response.setTimeout(500); 

    var myCallback = function(err, data){ 
     if(err){ 
      response.writeHead(200, {"Content-Type": "text/plain"}); 
      response.write('an error occured with requested method'); 
      response.end(); 
     }else{ 
      response.writeHead(200, {"Content-Type": "text/plain"}); 
      response.write(data); 
      response.end(); 
     } 

    } 

    //var finalValue = route(pathname, query); 
    //var finalValue = 0; 
    (function(){route(pathname, query, myCallback)})(); 
    response.writeContinue(); 
    //process.nextTick(myCallback(null, 'hello world')); 
    setTimeout(function(){ 
     myCallback(null, "hello world"); 
    }, 15); 

    //myCallback(); 
    //response.writeHead(200, {"Content-Type": "text/plain"}); 
    //response.write("Hello World. You requested: " + pathname + " with type " + pathname.type + ", value: " + finalValue); 
    //response.end(); 
} 

// create the server and signal console of start 
http.createServer(onRequest).listen(8080, process.env.OPENSHIFT_INTERNAL_IP); 
// for debug 
//http.createServer(onRequest).listen(process.env.PORT, process.env.IP); 
console.log("Server has started. Listening to port: " + 8080 + " ip address: " + process.env.OPENSHIFT_INTERNAL_IP); 

Если я вызываю метод myCallback непосредственно внутри метода onRequest, то я получаю ответ обратно без каких-либо проблем; однако, вызов функции myCallback внутри методов onRequest или маршрута с использованием process.nextTick или setTimeout, похоже, не работает. Я работаю над этим проектом с помощью Cloud9 IDE с прямым git-push для OpenShift, поэтому у меня возникают некоторые трудности с моей отладкой, но я попробовал несколько разных подходов без успеха, включая установку функции request.setTimeout, чтобы предоставить некоторое время для таймер/событие процесса для запуска. В моем текущем приложении OpenShift работает Node.js 0.6. Есть ли что-нибудь очевидное, что может вызвать проблемы, которые могут быть пропавшими без вести?

+0

Можете ли вы опубликовать ссылку на суть того, что выглядит нерабочий код? Выше я не вижу тайм-аута и метода маршрута. – CommaToast

+0

Я отредактировал свой оригинальный ответ, чтобы включить мой полный код. – StMotorSpark

+0

Два вопроса: почему вы делаете «var myCallback = function (err, data)» вместо «function myCallback (err, data)»? И почему вы делаете «util.process.nextTick» вместо «process.nextTick»? – CommaToast

ответ

2

Я получил ваш SetTimeout работать, делая это:

  • комментарий из "response.setTimeout (500);" в строке 54. Это недействительно.
  • комментарий вне "(function() {route (путь, запрос, myCallback)})();" в строке 71. Также недействителен.
  • изменение времени ожидания до 5000 на линии 76 (5000 мс = 5 секунд)

Для nextTick работы:

  • везде только сделать "process.nextTick" не "util.process.nextTick" ,
  • изменить строку 16 на: "returnValue = добавить (запрос ['num1'], query ['num2']). ToString();" (Должны привести его в виде строки!)
  • раскомментируйте 17, 18, 19, чтобы увидеть это теперь будет работать
  • комментарий из строки 54, вам не нужен этот
  • изменить линию 70 в «путь (путь к файлу , запрос, myCallback);

Вы должны увидеть, что вы сделали неправильно сейчас.

+0

http: // localhost: 8080/ADD? Num1 = 1 & num2 = 2 должен быть ваш URL. Btw – CommaToast

+0

Спасибо за ваш вклад. Используя ваши советы, похоже, у меня это работает. – StMotorSpark

+0

Добро пожаловать: D – CommaToast

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