将NodeJS回调从导出的函数传递给视图

时间:2015-05-07 20:33:00

标签: javascript node.js

我正在开发一个NodeJS应用程序,并且像这样导出一个函数:

module.exports = {
  userCount: function(done) {
    user.count(function(err, count) {
      done(count);
    });
  }
}

我要做的是将回调传递给视图。这就是我目前的做法:

methods.userCount(function(count) {
  app.get("/", function(req, res) {
    res.render("../views/index", {
      userCount: count
    });
  });
});

工作正常但我的问题是会导出多个函数,因此,我需要将多个回调传递给同一个视图。

我目前正在采用的方式是将回调传递给视图的最佳/唯一方式吗?

我想到的另一种方法是声明一个变量,只需将回调添加到变量中。像这样:

var num;
methods.userCount(function(count) {
  num = count;
});

res.render("../views/index", {
  userCount: num
});

但我不确定这是不是很好。有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

你应该在路由处理程序中调用userCount函数而不是相反:

app.get("/", function(req, res) {
  methods.userCount(function(count) {
    res.render("../views/index", {
      userCount: count
    });
  });
});

如何计算计数是一个应该在userCount方法中的实现细节。

我认为更好的方法是将userCount方法作为路线middleware运行,并将计数附加到res.locals

app.use(function(req,res,next) {
  // error handling omitted for simplicity
  methods.userCount(function(count) { 
    res.locals.count = count;
    next();
  });
})

app.get("/", function(req, res) {
  res.render("../views/index", {
    userCount: res.locals.count
  });
});

答案 1 :(得分:0)

Step可能对你有帮助吗?

function method(callback) {
  var err = null;
  var result = 123;
  callback(err, result);
}
function method2(callback) {
  var err = null;
  var result2 = 'abc';
  callback(err, result2);
}

app.get("/", function(req, res) {
  Step(
    function getData() {
      method(this); // this is a callback for the next function on Step
    }, 
    function getAnotherData(err, result) { // err, result is the reply of method()
      req.result = result; // keep result to use on next function
      method2(this);
    },
    function render(err, result2) {
      res.render('view', {
        result: req.result,
        result2: result2
      });
    }
  )
});