gpt4 book ai didi

javascript - Express app.all 声明 req/res 与 not

转载 作者:行者123 更新时间:2023-12-02 15:50:23 26 4
gpt4 key购买 nike

在 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)

两者有什么区别,哪一个更好?

最佳答案

tl;博士

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

<小时/>

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

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(req, res, next) 调用 proxy,但这不是惯用的(一般情况下,尤其是对于 express )。 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')
})

关于javascript - Express app.all 声明 req/res 与 not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31890574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com