1

OpenShift でホストされている Node.js の安静な Web サービスに取り組んでいます。現在、単純なメソッド呼び出しなどで成功していますが、非同期コールバックを介して http 応答を取得できないようです。

これが私が現在持っているものです:

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);

onRequest メソッド内で myCallback メソッドを直接呼び出すと、問題なく応答が返されます。ただし、process.nextTick または setTimeout を使用して onRequest または route メソッド内で myCallback 関数を呼び出すことは機能していないようです。私は Cloud9 IDE を使用して OpenShift への直接の git プッシュを使用してこのプロジェクトに取り組んでいるため、デバッグに問題がありますが、request.setTimeout 関数を設定して時間を提供するなど、かなりの数の異なるアプローチを試しましたが成功しませんでした。起動するタイマー/プロセス イベント。私の現在の OpenShift アプリは Node.js 0.6 を実行しています。私が見逃している可能性のある問題を引き起こしている可能性のある明白なものはありますか?

4

1 に答える 1

2

これを行うことで、setTimeoutが機能するようになりました:

  • 「response.setTimeout(500);」をコメントアウトします。54行目。無効です。
  • 「(function(){route(pathname, query, myCallback)})();」をコメントアウトします。71 行目。これも無効です。
  • 76 行目でタイムアウト時間を 5000 に変更 (5000ms = 5 秒)

nextTick を機能させるには:

  • どこでも「util.process.nextTick」ではなく「process.nextTick」のみを実行します。
  • 16 行目を「returnValue = add(query['num1'], query['num2']).toString();」に変更します。(文字列としてキャストする必要があります!)
  • 17、18、19 のコメントを外して、これが機能することを確認します
  • 54行目をコメントアウトします。これは必要ありません
  • 行 70 を「route(pathname, query, myCallback);」に変更します。

あなたは今、あなたが何を間違っていたかを見るべきです。

于 2013-06-16T23:29:59.137 に答える