返回资讯中心
外部精选
软件工程
#开发者实时流

Sails 风格路由实现:拆分控制器名与方法名动态调用

来源标题:Chapter 04: Implementing Sails-style Routing

在 Express 中实现 Sails 风格路由时,需将路由值按点号拆分为控制器名和方法名,才能从 controllers 对象动态取得对应方法。文章给出 app.js 中的完整代码,用 require-all 加载控制器,并解析路由字符串中的 HTTP 动词与路径。

Hacker News 最新chauhankiran2026/11/8 · 5 天前7 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

尽管所有控制器方法都能通过 controllers 对象获取,但我们无法用单个字符串动态调用它们。我们需要分别提取控制器名称和方法名称。为此,可以用点(.)字符来拆分路由定义的值。 let location = routes[route]; location = location.split("."); let controllerLocation = location[0]; let methodLocation = location[1]; 现在控制器名称和方法名称已经分开了。我们可以用它们从 controllers 对象中访问对应的控制器和方法。 let controller = controllers[controllerLocation]; let method = controller[methodLocation]; 把所有内容整合到 app.js 文件中。 const express = require("express"); const app = express(); const controllers = require("require-all")({ dirname: __dirname + "/controllers", filter: /(.+Controller).js$/, }); const routes = require("./routes"); for (let route in routes) { const verbExpr = /^(get|post|put|delete)\s+/i; const match = route.match(verbExpr); const verb = match ? match[1].toLowerCase() : null; let path = route; path = path.replace(verbExpr, ""); let location = routes[route]; location = location.split("."); let controllerLocation = location[0]; let methodLocation = location[1]; let controller = controllers[controllerLocation]; let method = controller[methodLocation]; app.listen(3000, () => { console.log("Application is up and running on port 3000"); }); 经过这些改动,我们现在有了要调用的 HTTP 方法、路由路径和控制器方法。 向 Express 注册路由只需一行代码: app[verb](path, method); 它会动态访问对应的 Express 方法,例如 app.get() 或 app.post(),并将路由路径和控制器方法作为参数传入。 把这行代码加到 app.js 文件中,就完成了可运行的 Express 应用。 const express = require("express"); const app = express(); const controllers = require("require-all")({ dirname: __dirname + "/controllers", filter: /(.+Controller).js$/, }); const routes = require("./routes"); for (let route in routes) { const verbExpr = /^(get|post|put|delete)\s+/i; const match = route.match(verbExpr); const verb = match ? match[1].toLowerCase() : null; let path = route; path = path.replace(verbExpr, ""); let location = routes[route]; location = location.split("."); let controllerLocation = location[0]; let methodLocation = location[1]; let controller = controllers[controllerLocation]; let method = controller[methodLocation]; app[verb](path, method); app.listen(3000, () => { console.log("Application is up and running on port 3000"); }); 继续重启应用。在浏览器和/或 Insomnia 中再次测试这三个路由。你应该会看到与之前相同的输出。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →