【问题标题】:NodeJS Express defining custom routesNodeJS Express 定义自定义路由
【发布时间】:2017-06-01 17:57:50
【问题描述】:

这可能是一个我不理解的非常基本的概念,但在我的 NodeJS 应用程序中,我正在尝试定义自定义路由。

我的目录结构如下

/application
    /app.js
    /package.json
    /node_modules
    /public
    /routes
        /control
            /users.js
    /views
        /control
            /users.ejs

我对此很满意,因为我希望将路线和视图保持在一对一的关系中,因为我最终会得到类似的结果

/application
    /app.js
    /package.json
    /node_modules
    /public
    /routes
        /control
            /users.js
            /system.js
        /tools
            /stock.js
            /report.js
    /views
        /control
            /users.ejs
            /system.ejs
        /tools
            /stock.ejs
            /report.ejs

所以我不想最终得到一个包含大量路由代码的 /routes/index.js 文件。

当我的 app.js 文件如下时,它似乎可以工作

//==============================================================================
// setup
//==============================================================================

var express = require("express");
var path = require("path");

var app = express();
var port = 3000;
var message = null;

app.set("view engine", "ejs");

app.use(express.static(path.join(__dirname, "public")));

//==============================================================================
// routes
//==============================================================================

var users = require("./routes/control/users");
app.get("/", users.users);

//==============================================================================
// start server
//==============================================================================

app.listen(port, function() {

   message = "Server Started : Port " + port;
   console.log(message);

});

虽然我可以看到这最终会看起来像

//==============================================================================
// setup
//==============================================================================

var express = require("express");
var path = require("path");

var app = express();
var port = 3000;
var message = null;

app.set("view engine", "ejs");

app.use(express.static(path.join(__dirname, "public")));

//==============================================================================
// routes
//==============================================================================

// control

var users = require("./routes/control/users");
app.get("/", users.users);

var system = require("./routes/control/system");
app.get("/", system.system);

// tools

var stock = require("./routes/tools/stock");
app.get("/", stock.stock);

var report = require("./routes/tools/report");
app.get("/", report.report);

//==============================================================================
// start server
//==============================================================================

app.listen(port, function() {

   message = "Server Started : Port " + port;
   console.log(message);

});

所以我真的不想有那么多要求,但是像下面这样做似乎不起作用,我不知道为什么

// control

var control = require("./routes/control");

app.get("/", control.users.users);
app.get("/", control.system.system);

// tools

var tools = require("./routes/tools");

app.get("/", tools.stock.stock);
app.get("/", tools.report.report);

【问题讨论】:

    标签: javascript node.js express ejs


    【解决方案1】:

    您可以使用 express Router 对象来链接您的路由。这是一个例子

    /app.js

    var routes = require('./routes/index');
    
    // as noted by Paul in the comments, 
    // you could use `app.use(routes)` for simplicity
    app.use('/', routes);
    

    /routes/index.js

    var routes = require('express').Router();
    
    routes.route('/test')
        .get(function (req, res) {
            res.send(req.originalUrl);
        });
    
    routes.use('/control', require('./control/user'));
    
    module.exports = routes;
    

    /routes/control/user.js

    var routes = require('express').Router();
    
    routes.route('/test')
        .get(function (req, res) {
            res.send(req.originalUrl);
        });
    
    module.exports = routes;
    

    因此,对于 index.js 中定义的路由,您需要向 /test 发送 GET 请求,而在 user.js 中,您需要向 /control/test 发送 GET 请求以获得响应。

    这样,您需要在主 js 文件(在您的情况下为 app.js)中包含主路由文件,即路由目录下的 index.js。无论哪种方式,您仍然需要为每个导出路由器对象的文件执行一个 require 语句。

    【讨论】:

    • 很好的例子,虽然应该注意你可以简化你的第一个app.use()语句:app.use(routes);,因为根路径是默认的。
    • @Paul 是的,这是真的。复制粘贴习惯。 :)
    • 这看起来是一个非常棒的答案,@dNitro 的答案让我更容易理解
    • @Trent 无论如何最适合我想说的开发人员。如果以后需要重构代码,可以以此为基础。
    【解决方案2】:

    当你说:

    var control = require("./routes/control");
    

    节点会做以下事情:

    1. 由于您指定了 相对路径 要求,它将在当前文件夹中搜索 routes 目录,并在该目录中搜索 control.js 文件。它找不到 control.js 文件,所以:
    2. 搜索 control.json 文件。但它也找不到 文件。那么:
    3. 搜索控制目录。它会找到这样一个目录。打开 它并搜索 package.json 文件以查看其 主要属性。但它也找不到这样的文件。那么:
    4. 搜索index.js文件,但也没有这样的文件

    默认情况下,当您为 require 提供文件夹路径时,它不会自动在该文件夹中加载 .js 文件,它会自动查找 package.json 文件,如果不存在则加载 index.js。一世。 e.它寻找一个入口点。

    所以在你的控制文件夹中创建一个 index.js

    /routes
      /control
        /users.js
        /system.js
        /index.js
    

    index.js:

    module.exports = {
      users: require('./users');
      system: require('./system');
    };
    

    也为您的 tools 目录执行此操作,您的最后一种方法应该有效。

    注意,您可以考虑使用express.Router 来管理路由。

    【讨论】:

    • 非常感谢这个答案解决了我的问题,代码看起来非常简单易用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2018-03-12
    • 2016-05-17
    相关资源
    最近更新 更多