【问题标题】:Make route-specific code apply to all routes?使特定于路线的代码适用于所有路线?
【发布时间】:2016-04-12 01:24:54
【问题描述】:

我有一个管理面板,我可以在其中自定义网站名称、标语等内容。下面的代码完全符合我的要求,但仅适用于索引页面:

app.get("/", function (req, res) {
  app.service("customization").find().then(function (result) {
    res.render("index", Object.assign({ layout: "layouts/default" }, result[0]));
  });
});

我如何使它适用于所有路线(所以,整个网站)?我试过用* 代替/,但这没有帮助。

编辑:用* 替换/ 并将这段代码放在我的所有路由之前,使每个页面都呈现我的index 视图,这并不理想。目前,我将为每条路线复制此代码,更改路线和视图选项。我有这样的代码:

app.get("/admin/:page", require("connect-ensure-login").ensureLoggedIn("/admin"), function (req, res) {
  app.service("customization").find().then(function (result) {
    res.render("admin/" + req.params.page, Object.assign({ user: req.user, title: "Admin", layout: "layouts/admin" }, result[0]));
  });
});

为了确保我没有重复太多,但仍然......

【问题讨论】:

    标签: express feathersjs


    【解决方案1】:

    您可以使用* 作为通配符,将路由器应用到所有 URL 以代替星号。

    但是,如果您需要在其余路由器中重用异步结果,以下是一个不错的方法。在您的路由器之前执行异步调用,并在其余路由器中使用result

    app.use(function(req, res, next) {
        app.service("customization").find().then(function (result) {
            app.set('result', result);
            next();
        });
    });
    

    这将设置一个应用程序变量,该变量可以使用app.get 从任何服务器端 访问。

    注意异步回调中next() 的要求。该应用程序将在继续之前等待result,确保您在没有它的情况下不会继续下一个路由器。

    app.get("/", function (req, res) {
        res.render("index", Object.assign({ layout: "layouts/default" }, app.get('result')[0]));
    });
    

    在您的路由器中,您可以根据需要使用app.get 访问result 变量。

    【讨论】:

    • 因为我不想为每条路线渲染index 页面。我正在为每条路线呈现不同的页面。另外,很遗憾,您的代码在我的项目中不起作用。
    • 您声明您希望您的代码适用于所有路线。您发布的代码呈现 HTML,一旦呈现一个页面,您将无法呈现另一个页面。请在原帖中说明您想要的最终目标,我可以尽力提供帮助。
    • 显然发布的代码是错误的......而且,我很确定我已经陈述了我的目标。通常,当他们提出关于 SO 的问题时,必须证明他们已经尝试实现解决方案,因此我分享了我的代码。那是行不通的。因此我的查询。
    • 在 ExpressJS 4.x 上使用星号作为通配符,我已经更新了我的答案。也许检查你的路由器的顺序。
    • 您只想在所有路由器之前拨打app.service 吗?如果是这样,我已经更新了上面的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多