Подтвердить что ты не робот

Как монтировать маршруты app.get() на конкретном префиксе пути

Я пишу API, используя Node.js и Express. В моем API есть методы GET формы:

/api/v1/doSomething
/api/v1/doSomethingElse

Мой код выглядит примерно так:

server.js:

var app = express();
...
var routes = require('./routes')
routes.attachHandlers(app, '/api/v1')

маршруты /index.js

...
module.exports.attachHandlers = function(app, context) {
    //get a list of all the other .js files in routes
    //for each route, require() it and call it myRoute
    myRoute.attachHandlers(app, context)
}

маршруты/некоторые-route.js

...
module.exports.attachHandlers = function(app, context) {
    app.get(context + '/doSomething', doSomething)
    app.get(context + '/doSomethingElse', doSomethingElse)
}
...

Фактически я передаю путь контекста/точку монтирования вниз через приложение. Если кто-то должен был написать маршрут, как показано ниже, контекст будет потерян:

app.get('/doFoo', foo)

Вместо того, чтобы эта часть API смонтирована на /api/v1/doFoo на /doFoo. Я бы хотел, чтобы вам не пришлось проходить путь контекста таким образом.

app.use поддерживает установку промежуточного программного обеспечения на дополнительном пути монтирования. Я видел ссылки онлайн для установки всего приложения Express на пути монтирования с помощью app.use. Это похоже на то, что я хочу сделать, но я не уверен, как это сделать или если это лучшее решение для моего конкретного случая использования.

Подводя итог - я хочу установить мои маршруты app.get() с определенным префиксом по умолчанию. Какой лучший способ сделать это?

4b9b3361

Ответ 1

Я думаю, express-namespace будет работать для этого.

Ответ 2

С Express 4.0 задача намного чище с маршрутизатором. Вы можете создать столько маршрутизаторов, сколько вам нужно, чтобы разделить ваше приложение, а затем привязать их к app.use(). Например:

myapp.js

var express = require("express"),
    router  = express.Router(),
    app     = express(),
    port    = 4000;


// Here we declare our API which will be visible under prefix path
router.get('/', function (req, res) {
    console.log("request to subspace hello");
    res.send({ message: "Hi from subspace /api/v1/"});
});

// we attach our routes under /api/v1
app.use('/api/v1', router);


// here we have direct, root-level routing
app.get('/', function (req, res) {
    console.log("request to rootspace hello");
    res.send({message: "Hi from root /"});
});

app.listen(port);
console.log("App active on localhost:" + port);

Затем запустите

node myapp.js

и посетите

http://localhost:4000 and http://localhost:4000/api/v1

Ответ 3

Здесь приведен рабочий пример установки маршрута в Express 3:

./snipe3app.js

var express = require('express');
var app = module.exports = express();

app.get('/subapp', function (req, res) {
  res.send('You are on the /sub/subapp page.');
});

./app.js

var express = require('express'),
    http = require('http'),
    subApp = require('./snipe3app'),
    app = express();

app.use(express.favicon());
app.use(express.bodyParser());
app.use(app.router);
app.use('/sub', subApp);

app.get('/', function (req, res) {
  res.send('You are on the root page');
});

http.createServer(app).listen(3000, function(){
  console.log('Express server listening on port 3000. Point browser to route /secure');
});

Вы должны обратить внимание на порядок обработки маршрутов при этом.