快递app.all声明req / res vs

时间:2015-08-08 06:58:44

标签: javascript node.js express

在快递中,其他一切都保持不变,是否存在差异:

app.all('/', mongoProxy(config.mongo.dbUrl, config.mongo.apiKey));

app.all('/', function (req, res) {
  mongoProxy(config.mongo.dbUrl, config.mongo.apiKey);
 });

前者能够从mongoProxy返回返回值,而后者不是,mongoProxy看起来像这样:

module.exports = function(basePath, apiKey) {

  basePath = url.parse(basePath);

  // Map the request url to the mongolab url
  // @Returns a parsed Url object
  var mapUrl = module.exports.mapUrl = function(reqUrlString) {
    //use the basePath to Parse the URL
    return newUrl;
  };

  var mapRequest = module.exports.mapRequest = function(req) {
    var newReq = mapUrl(req.url);
    // Make a new request and return it..
    return newReq;
  };

  var proxy = function(req, res, next) {
    try {
      var options = mapRequest(req);
      // Create the request to the db
      var dbReq = https.request(options, function(dbRes) {
         // Save result 
        });
          // { send result }
          res.send(data);
          res.end();
        });
      });
      // send request 
      dbReq.end(JSON.stringify(req.body));
    } catch (error) {
      //..
    }
  };
  return proxy;
};

关于解释两者之间概念差异的文件并不清楚;在我已经看过的例子中,前一个函数

app.all('/', mongoProxy(config.mongo.dbUrl, config.mongo.apiKey));

能够访问req和res对象,而不会像后者function (req, res)那样实际传入。

两者有什么区别,是不是更好?

2 个答案:

答案 0 :(得分:2)

TL;博士

是的,有区别:第一个会起作用,而第二个会挂起(你不会调用mongoProxy返回的匿名函数)。第一个是优选的,因为它表达更加惯用(你使用的是中间件)。

首先,请注意mongoProxyreturn proxy中的匿名函数:

module.exports = function(basePath, apiKey) {
  /* snip */
  var proxy = function(req, res, next) { // <-- here
  /* snip */
  };
  return proxy;    // <-- and here
};

让我们分解一下:

var proxy = mongoProxy(config.mongo.dbUrl, config.mongo.apiKey)
// proxy is an anonymous function which accepts: (req, res, next)

app.all('/', proxy);
// express will use proxy as the callback (middleware), which means this is the same as:
app.all('/', function (req, res, next) {
    proxy(req, res, next)
})

让我们重写第二个例子 - 它应该清楚的原因:

var proxy = mongoProxy(config.mongo.dbUrl, config.mongo.apiKey)
app.all('/', function (req, res) {
    proxy    // nothing happens because you don't invoke the function
});

如果您想使用第二个示例,可以使用proxy调用proxy(req, res, next),但这不是惯用的(一般情况下,尤其是快递)。 Express是关于中间件的,所以请使用第一个示例。

这是另一个使用闭包的例子(很像你的mongoProxy函数):

function getPermissionLevelMiddleware (level) {
    // returns an anonymous function which verifies users based on `level`
    return function (req, res, next) {
        if (req.isAuthenticated() && req.user.permission.level > level)
            return next()
        return res.redirect('/no/permission')
    }
}

var isAdmin = getPermissionLevelMiddleware(9000)
// `isAdmin` only allows users with more than 9000 `user.permission.level`
var isPleb = getPermissionLevelMiddleware(1)
// `isPleb` allows users with more than 1 `user.permission.level`

app.get('/admin', isAdmin, function (req, res) {
    res.render('admin.jade')
})

答案 1 :(得分:0)

显然第一个会返回结果,因为 req res 对象都可以访问,而第二种情况则需要发送 req mongoProxy 方法参数中的 res 。如果您没有发送, req和res 将无法访问。因此,要使第二种方案起作用,需要将方法签名更改为:

module.exports = function(basePath, apiKey, req, res) {

我已经完成了