app.use("*", topUsers)
..
topUsers
function topUsers(req, res, next){
console.log("req.url", req.url)
findMostUsefullReviewsAggregate(6)
.then(function(aggregationResult){
// console.log("aggregationResult", aggregationResult)
// console.log("***aggregationResult::", aggregationResult)
return populateMostUseful(aggregationResult)
})
.then(function(populated){
console.log("<<<<<<<<<<<<<<<<<<TOPUSER CALLED >>>>>>>>>>>>")
// console.log("POPULATED: ", populated);
console.log(">>>populateMostUseful.length");
populated = populated.map(function(e){
e.momented = moment(e.createdAt.getTime()).fromNow();
return e;
})
req.session.mostUsefulReviews = populated;
// res.end()
})
.catch(function(err){
console.log("HEADERERR", err);
});
next();
}
(以后的一些信息:main.ejs用于("/")
)
当我将其更改为app.get("/", topUsers)
并转到"/"
时,它只会被调用一次(这就是我想要的)。
req.url的console.log显示&#34; /&#34;对于所有3
在我的main.ejs
中,我添加了header.ejs
。我认为这可能是一个问题。也许对包含标题的请求是一个问题,但我不这么认为。
快速提问:如果我执行app.get(&#34; /&#34;)会对/users/idofuser
等所有子路由有效吗?我想如果我这样做,功能就不会被调用。
我认为app.get("*")
也给了我多次调用的同样问题。
编辑:当我将next
放入.then()
时,它仍会被多次调用。
我的真正目标是在所有路线上发生一些事情。我已经设置了路线。我不想去每条路线并做一些像app.get(&#34; /&#34;,onemiddleware,topUsers,)。我不想在每个人身上放置topUSers。我一定要吗。
答案 0 :(得分:0)
如果您是从加载网页的浏览器执行此操作,则浏览器可能会从网站请求多个资源。
首先,它通常会请求favicon,如果网页中还有其他任何资源(其他脚本,样式表,图片等等),则每个资源都会对您的网页发出单独的请求。您可以通过为每个请求记录req.url
来确切了解所请求的URL。从单个页面加载,您应该没有理由获得/
的三个请求,但您很可能会获得/
的请求,然后请求其他一些资源(以及其他一些资源) URL)来自同一台服务器。
向我们展示您正在加载的网页,我们可以更好地指出正在发生的事情。
如果您真正想要做的是在一组路由上共享中间件,那么您可以创建一个路由器,将中间件放在路由器上router.use()
,定义您想要的所有路由在该特定路由器上安装该中间件,然后将路由器挂钩到您的应用程序中。这将仅针对与该路由器匹配的路由执行中间件,并且您只需为路由器指定一次中间件,并且该路由器上定义的所有路由将使用该中间件。直接在app
对象或其他路由器上定义的其他路由将不使用中间件。您必须将路由器定义为一些唯一的路径根或通配符,以帮助表明应该将哪些路由传递到您的路由器。我们必须看到您计划使用的整个路径,我们不会使用该中间件来更清楚地了解建议的内容。