Как я могу сделать свою маршрутизацию без одного длинного файла всех маршрутов в nodejs? - PullRequest
2 голосов
/ 23 мая 2011

Используя эту ссылку в качестве ссылки https://github.com/visionmedia/express/tree/master/examples/route-separation на то, что "может быть сделано"

Я НЕ ИСПОЛЬЗУЮ EXPRESS.Я использую их в качестве примера.

Я хочу сделать что-то вроде этого, но "проще" ...

Как мне избежать объявления всех моих маршрутов за один раз?Сложный список все в одном файле?Могу ли я определить их, передав маршрутизатор в мои модули, а затем включив весь код в одну директорию ... хорошо, у меня будет один длинный документ, который требует только «требует», например index.js, для этогоодин, по крайней мере, один, который мои сценарии сборки могут пересобрать для меня, но желательно не в моем основном файле для каждого отдельного маршрута, который я могу добавить.

Так, например, они используют этот код:

// General

app.get('/', site.index);

// User

app.all('/users', user.list);
app.all('/user/:id/:op?', user.load);
app.get('/user/:id', user.view);
app.get('/user/:id/view', user.view);
app.get('/user/:id/edit', user.edit);
app.put('/user/:id/edit', user.update);

// Posts

app.get('/posts', post.list);

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

Вот что я хочу сделать: (пожалуйста, не критикуйте код, я делаю его очень простым, поэтому я делаюуверен, что я иллюстрирую свой код так, как хочу это сделать)

//app.js
var router = require('./myRouter.js')
var includes = require('./routes/*.js').register(router)

// do some stuff here with an https server and start the server here

и

//./routes/user.js
var myRouter;
exports.register(router){
  myRouter = router;
}
router.addRoute(/* here I do the magic associated with this route */)

Могу ли я сделать это просто так?Что я здесь упускаю?

Я не написал этот код, потому что я просто уверен, что поступаю неправильно.

И если я собираюсьдолжен использовать что-то вроде index.js в папке /routes/, могу ли я использовать ту же концепцию, которую я продемонстрировал, которую я хотел бы использовать в своем коде .register(router), добавленном, чтобы я мог передать эту информацию рекурсивно?Будет ли это работать?

Ответы [ 2 ]

3 голосов
/ 23 мая 2011

Я использую index.js файл для этого и использую require("routes"), который является папкой.

// app.js
route = require("./routes"),
...
route(app);

// routes/index.js
var index = require("./index-route"),
    about = require("./about-route"),
    posts = require("./posts-route");

module.exports = function(app) {
    index(app);
    about(app);
    posts(app);
};

Это работает, потому что, если вы require папка, она будет загружать index.js по умолчанию.

Если у вас много маршрутов, вы можете загрузить их в соответствии с соглашением

var routes = [];
// read all files
fs.readdir("./", function(files) {
    files.forEach(function(val) {
        // require all non-index.js files.
        if (val !== "index.js") {
            routes.push(require(val));
        }
    });
});

module.exports = function(app) {
    // for each route you required call it with app.
    routes.forEach(val.bind(null, app));
}

Это приведет к загрузке всех файлов .js, которые не являются "index.js", поэтому любой файлв вашей папке /routes/ будет загружаться и запускаться при маршрутизации.

1 голос
/ 23 мая 2011

Ваше решение выглядит неопределенно так, как если бы вы хотели использовать Visitor Patern , и в этом случае я предлагаю вам сделать ./roots/ обязательным ( см. Этот вопрос ) и в index.js вы включаете все нужные вам файлы (как локальные) и export модуль регистрации, который вызывает модуль регистрации для каждого из необходимых файлов.

Или вы можете скопировать код из приведенного выше ответа прямо в свойосновной файл.

...