NodeJS Express定义自定义路由

时间:2017-01-17 15:31:49

标签: javascript node.js express ejs

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

我的目录结构如下

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

我很满意,因为我希望将路线和观点保持在1对1的关系中,因为我最终会得到像

这样的东西
/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);

2 个答案:

答案 0 :(得分:6)

您可以使用快速路由器对象来链接您的路线。这是一个例子

<强> /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,是主路由文件,它是routes目录下的index.js。无论哪种方式,您仍然需要为导出路由器对象的每个文件执行一个require语句。

答案 1 :(得分:2)

当你说:

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

Node将执行以下操作:

  1. 由于您将相对路径保留为require,它将在当前文件夹中搜索 routes 目录,并在该目录中搜索 control.js 文件。它无法找到 control.js 文件,因此:
  2. 搜索 control.json 文件。但它也找不到 文件。然后:
  3. 搜索控制目录。它找到了这样一个目录。打开 它并搜索 package.json 文件来查看它     主要属性。但它也找不到这样的文件。然后:
  4. 搜索 index.js 文件,但也没有这样的文件
  5. 默认情况下,当您提供 require 的文件夹路径时,它不会自动加载该文件夹中的 .js 文件,它会查找 package.json 文件,如果不存在,则加载 index.js 。一世。即它寻找一个切入点。

    在控制文件夹中创建 index.js

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

    index.js:

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

    也可以为您的工具目录执行此操作,并且您的上一个方法应该有效。

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