app.use(" *")似乎多次调用函数

时间:2016-12-26 08:12:36

标签: javascript node.js express mongoose ejs

多次调用

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。我一定要吗。

1 个答案:

答案 0 :(得分:0)

如果您是从加载网页的浏览器执行此操作,则浏览器可能会从网站请求多个资源。

首先,它通常会请求favicon,如果网页中还有其他任何资源(其他脚本,样式表,图片等等),则每个资源都会对您的网页发出单独的请求。您可以通过为每个请求记录req.url来确切了解所请求的URL。从单个页面加载,您应该没有理由获得/的三个请求,但您很可能会获得/的请求,然后请求其他一些资源(以及其他一些资源) URL)来自同一台服务器。

向我们展示您正在加载的网页,我们可以更好地指出正在发生的事情。

如果您真正想要做的是在一组路由上共享中间件,那么您可以创建一个路由器,将中间件放在路由器上router.use(),定义您想要的所有路由在该特定路由器上安装该中间件,然后将路由器挂钩到您的应用程序中。这将仅针对与该路由器匹配的路由执行中间件,并且您只需为路由器指定一次中间件,并且该路由器上定义的所有路由将使用该中间件。直接在app对象或其他路由器上定义的其他路由将不使用中间件。您必须将路由器定义为一些唯一的路径根或通配符,以帮助表明应该将哪些路由传递到您的路由器。我们必须看到您计划使用的整个路径,我们不会使用该中间件来更清楚地了解建议的内容。