Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 快速应用程序。所有声明请求/回复与否_Javascript_Node.js_Express - Fatal编程技术网

Javascript 快速应用程序。所有声明请求/回复与否

Javascript 快速应用程序。所有声明请求/回复与否,javascript,node.js,express,Javascript,Node.js,Express,在express中,其他一切都保持不变,这两者之间有区别吗: app.all('/', mongoProxy(config.mongo.dbUrl, config.mongo.apiKey)); 及 前者能够从mongoProxy返回返回值,而后者则不能,其中mongoProxy如下所示: module.exports = function(basePath, apiKey) { basePath = url.parse(basePath); // Map the request

在express中,其他一切都保持不变,这两者之间有区别吗:

app.all('/', 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对象,而无需像在后者中那样实际传入,
函数(req,res)

两者的区别是什么,一个更好吗?

tl;博士 是的,有一个区别:第一个将工作,而第二个将挂起(您不调用由
mongoProxy
返回的匿名函数)。第一种更可取,因为它更易于表达(您正在使用中间件)


首先,请注意在
mongoProxy
中,您如何
返回代理
,一个匿名函数:

module.exports = function(basePath, apiKey) {
  /* snip */
  var proxy = function(req, res, next) { // <-- here
  /* snip */
  };
  return proxy;    // <-- and here
};
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')
})
让我们重写第二个例子,它应该清楚地说明为什么它不起作用:

如果要使用第二个示例,可以使用
proxy(req,res,next)
调用
proxy
,但这不是惯用用法(一般来说,尤其是对于express)。Express是关于中间件的,所以使用第一个示例

下面是另一个使用闭包的示例(非常类似于您的
mongoProxy
函数):


显然,第一个将返回结果,因为它可以访问reqres对象,第二种情况下,您需要在mongoProxy方法参数中发送reqres。如果您不发送,req和res将无法访问。因此,要使第二个场景起作用,方法签名需要更改为:

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

我做了

漂亮的解释,非常有帮助。非常感谢!:-)@nikkwong很高兴我能帮忙。您的
mongoProxy
函数是一个很好的例子,说明了如何在JavaScript中使用闭包来记住变量的状态。投票不够!谢谢。@nikkwong在我的答案中发现了一个很大的错误(打字错误)。第一种情况更可取,而不是第二种情况。
var proxy = mongoProxy(config.mongo.dbUrl, config.mongo.apiKey)
app.all('/', function (req, res) {
    proxy    // nothing happens because you don't invoke the function
});
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')
})
module.exports = function(basePath, apiKey, req, res) {