2017-01-17 2 views
2

Это, пожалуй, действительно базовая концепция, которую я не понимаю, но в моем приложении NodeJS я пытаюсь определить собственный маршрут.NodeJS Express, определяющий настраиваемые маршруты

моя структура каталогов выглядит следующим образом

/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

Когда вы говорите:

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

Node будет делать следующее:

  1. Поскольку вы privided на относительного пути, чтобы требовать, она будет искать маршрутов каталога в течение и в этом каталоге найдите файл control.js. Он не может найти control.js файл так:
  2. Поиск control.json файл. но он также не может найти файл .затем:
  3. Поиск справочника . Он находит такой каталог. открывает и ищет package.json файл для просмотра Недвижимость. но он также не может найти такой файл. затем:
  4. Искать по index.js файлов, но и там нет такого файла

По умолчанию, когда вы даете путь к папке для требуется, он не загружает .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.

+1

Спасибо, что этот ответ решил мою проблему, и код кажется очень простым и простым в использовании – Trent

6

Вы может использовать объект 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, вам нужно отправить запрос GET на /test, а в user.js вам нужно будет отправить запрос GET на номер /control/test, чтобы получить ответ.

Таким образом, все, что вам нужно включить в основной файл js, app.js в вашем случае, является основным файлом маршрутов, который является index.js в каталоге маршрутов. В любом случае вам все равно нужно сделать одно требование для каждого файла, который экспортирует объект маршрутизатора.

+2

Хороший пример, хотя следует отметить, что вы можете упростить свой первый оператор 'app.use()' так: 'app.use (routes);', поскольку корневой путь является значением по умолчанию. – Paul

+0

@Paul Да, это правда. Скопировать вставку. :) – Brian

+0

Похоже, что отличный ответ на вопрос от @ dNitro был для меня немного легче понять. – Trent

Смежные вопросы