Javascript 定义自定义路由的NodeJS Express

Javascript 定义自定义路由的NodeJS Express,javascript,node.js,express,ejs,Javascript,Node.js,Express,Ejs,这可能是我不理解的一个非常基本的概念,但在我的NodeJS应用程序中,我试图定义一个自定义路由 我的目录结构如下 /application /app.js /package.json /node_modules /public /routes /control /users.js /views /control /users.ejs //===============

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

我的目录结构如下

/application
    /app.js
    /package.json
    /node_modules
    /public
    /routes
        /control
            /users.js
    /views
        /control
            /users.ejs
//==============================================================================
// 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);

});
我很高兴,因为我想让路线和视图保持一对一的关系,因为我最终会得到类似的东西

/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文件如下时,它似乎可以工作

/application
    /app.js
    /package.json
    /node_modules
    /public
    /routes
        /control
            /users.js
    /views
        /control
            /users.ejs
//==============================================================================
// 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);

您可以使用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);
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;
var routes = require('express').Router();

routes.route('/test')
    .get(function (req, res) {
        res.send(req.originalUrl);
    });

module.exports = routes;
/routes/index.js

var routes = require('./routes/index');

// as noted by Paul in the comments, 
// you could use `app.use(routes)` for simplicity
app.use('/', routes);
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;
var routes = require('express').Router();

routes.route('/test')
    .get(function (req, res) {
        res.send(req.originalUrl);
    });

module.exports = routes;
/routes/control/user.js

var routes = require('./routes/index');

// as noted by Paul in the comments, 
// you could use `app.use(routes)` for simplicity
app.use('/', routes);
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;
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文件,它位于routes目录下的index.js。无论哪种方式,您仍然需要为导出路由器对象的每个文件执行一条require语句。

当您说:

var control = require("./routes/control");
节点将执行以下操作:

  • 由于您指定了所需的相对路径,因此它将在当前文件夹中搜索routes目录,并在该目录中搜索control.js文件。它找不到control.js文件,因此:
  • 搜索control.json文件。但它也找不到 文件然后:
  • 搜索控制目录。它找到这样一个目录。打开 然后搜索一个package.json文件来查看它的 主要财产。但它也找不到这样的文件。然后:
  • 搜索index.js文件,但也没有这样的文件
  • 默认情况下,当您提供所需的文件夹路径时,它不会自动加载该文件夹中的.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');
    };
    
    对你的工具目录也要这样做,你的最后一种方法应该会奏效


    <强>注释< /强>您可以考虑使用管理路由。

    好例子,但是应该注意,您可以简化您的第一个代码> App.Author()/<代码>语句:<代码> App.使用(路由);<代码>,因为根路径是默认路径。@Paul是的,没错。复制粘贴习惯:)这看起来是一个非常好的答案,@dNitro的答案对我来说只是简单一点understand@Trent我想说的是,对开发者来说最好的东西。如果你以后需要重构你的代码,你可以以此为基础。非常感谢这个答案解决了我的问题,代码看起来非常简单,易于使用