Javascript node.js从回调发送响应

Javascript node.js从回调发送响应,javascript,node.js,Javascript,Node.js,我正在使用express框架来处理请求。其中一些步骤涉及调用异步函数。最后,我希望返回在其中一个函数中计算的值 app.post("/hello", function(req, res) { ... ... myFunc(finalFantasy); } function myFunc(callback) { ... callback(); } function finalFantasy() { //I want to return this

我正在使用express框架来处理请求。其中一些步骤涉及调用异步函数。最后,我希望返回在其中一个函数中计算的值

app.post("/hello", function(req, res) {
    ...
    ...

    myFunc(finalFantasy);
}

function myFunc(callback) {
    ...
    callback();
}

function finalFantasy() {
    //I want to return this value in the response
    var result = "magic";
}

如何在响应中使用finalFantasy函数中计算的值

继续传递
res
,并在最终的“响应生成函数”中向其发送数据。使用express执行此操作的一般方法是使用中间件级联,将持久值存储在res.locals中:

app.get("/", function(req, res, next) {
  // do things
  next();
},function(req, res, next) {
  // do more things
  next();
},function(req, res, next) {
  // do even more things!
  next();
},function(req,res) {
  // and finally we form a response
  res.write(things);
});
尽管您通常将其放入中间件文件中,然后将其包括在内,调用其函数:

// middleware "lib/functions.js" file
module.exports = {
  a: function(req, res, next) { ... },
  b: function(req, res, next) { ... },
  c: function(req, res, next) { ... }
}
然后在app.js、main.js或类似明显的主文件中:

var mylib = require("./lib/functions");
...
app.get("/", mylib.a, mylib.b, mylib.c);
...

完成了。通过
next
概念,流可以很好地组织和自动传递。

您必须将
res
实例传递给回调,或者像第二个示例一样使用回调

app.post("/hello", function(req, res) {
...
...

myFunc(finalFantasy, req, res);
}

function myFunc(callback, req, res) {
...
callback(req, res);
}

function finalFantasy(req, res) {
//I want to return this value in the response
var result = "magic";
res.end(result);
}
另一个例子是:

app.post("/hello", function(req, res) {
    ...
    ...
    var i = 3;

    myFunc(i, function(data) {
        res.end(data); // send 4 to the browser
    });
}

function myFunc(data, callback) {
    data++; //increase data with 1, so 3 become 4 and call the callback with the new value
    callback(data); 
}

//使用匿名函数包装finalFantasy

app.post("/hello", function(req, res) {
    ...
    ...
    myFunc(function () {
         var ret = finalFantasy();
         res.send(ret);
    });
}

function myFunc(callback) {
    ...
    callback();
}

function finalFantasy() {
    //I want to return this value in the response
    var result = "magic";
}

就像@raina77ow在评论中所说的那样,您几乎已经拥有了它,将结果以与问题中所示相同的代码结构进行备份,只需使
myFunc
返回
callback
的结果并使用它。您应该只对中间件执行此操作,通过将req/res传递给包装器myFunc,甚至更糟的是传递给finalFantasy,您使它们依赖于req/res,没有其他代码可以在没有req/res对象的情况下使用这些方法。第二个示例更好,在这里,您将控制权返还给拥有原始req/res的app.post回调
app.post("/hello", function(req, res) {
    ...
    ...

    var result = myFunc(finalFantasy);
}

function myFunc(callback) {
    ...
    return callback();
}

function finalFantasy() {
    //I want to return this value in the response
    var result = "magic";
    return result;
}