gpt4 book ai didi

javascript - Node.js 回调问题

转载 作者:行者123 更新时间:2023-11-30 18:00:28 24 4
gpt4 key购买 nike

一直致力于在 OpenShift 上托管的 Node.js Restful 网络服务。目前我在简单的方法调用等方面取得了成功,但似乎无法通过异步回调获得 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 或路由方法中调用 myCallback 函数似乎不起作用。我正在使用 Cloud9 IDE 和直接 git push 到 OpenShift 来处理这个项目,所以我在调试时遇到了一些困难,但尝试了很多不同的方法但没有成功,包括设置 request.setTimeout 函数为要触发的计时器/进程事件。我当前的 OpenShift 应用程序运行的是 Node.js 0.6。有什么明显的东西可能导致我可能遗漏的问题吗?

最佳答案

我通过这样做让你的 setTimeout 工作:

  • 注释掉“response.setTimeout(500);”在第 54 行。它无效。
  • 注释掉“(function(){route(pathname, query, myCallback)})();”在第 71 行。也无效。
  • 在第 76 行将超时时间更改为 5000(5000 毫秒 = 5 秒)

让 nextTick 工作:

  • 到处只做“process.nextTick”而不是“util.process.nextTick”。
  • 将第 16 行更改为:“returnValue = add(query['num1'], query['num2']).toString();” (必须将其转换为字符串!)
  • 取消对 17、18、19 的注释,看看它现在可以工作了
  • 注释掉第 54 行,你不需要这个
  • 将第 70 行更改为“route(pathname, query, myCallback);”

你现在应该看看你做错了什么。

关于javascript - Node.js 回调问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com