Работала над веб-службой 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. Есть ли что-нибудь очевидное, что может вызвать проблемы, которые могут быть пропавшими без вести?
Можете ли вы опубликовать ссылку на суть того, что выглядит нерабочий код? Выше я не вижу тайм-аута и метода маршрута. – CommaToast
Я отредактировал свой оригинальный ответ, чтобы включить мой полный код. – StMotorSpark
Два вопроса: почему вы делаете «var myCallback = function (err, data)» вместо «function myCallback (err, data)»? И почему вы делаете «util.process.nextTick» вместо «process.nextTick»? – CommaToast