2015-04-15 2 views
3

Существует ли библиотека, которая предоставляет маршрутизаторы раскладки в стиле Express? Что-то вроде этого:Есть ли вложенный в Express-стиль маршрутизатор для Koa.js?

var koa = require('koa'); 
var app = koa(); 
var Router = require('???'); 

var restApiRouter = Router(); 
restApiRouter.get('/', function*() { 
    // respond to /api/ 
}); 
restApiRouter.get('/messages', function*() { 
    // respond to /api/messages 
}); 

var appRouter = new Router(); 
appRouter.get('/', function*() { 
    // respond to/
}); 
// redirects all /api/* requests to restApiRouter 
appRouter.use('/api', restApiRouter); 

app.use(appRouter); 

Если нет, то в чем заключается наилучшая практика для инкапсуляции общих путей маршрута в другие файлы?

ответ

2

Предыдущий ответ не показывал точно, как развернуть маршрутизаторы. Вот пример реального мира, разделенный на несколько файлов контроллеров.

Во-первых, мы определим некоторые API маршрутов в controllers/api/foo.js файл:

var router = require('koa-router')(); 

router.get('/', function*() { 
    // Return a list of foos 
}); 

router.get('/:id', function*() { 
    // Return a specific foo 
}); 

module.exports = router; 

Затем на маршрутизаторе приложения, вы можете вставить его как следующий, в файле controllers/index.js:

var router = require('koa-router')(); 

// Create a new route 
router.get('/', function*() { 
    this.body = 'Home page'; 
}); 

// Nest previous API route 
router.get('/api/foo', require('./api/foo').routes()); 

module.exports = router; 

Наконец, просто используйте маршрутизатор в вашей заявке index.js:

var koa = require('koa'); 
var app = koa(); 
app.use(require('./controllers').routes()); 
app.listen(process.env.PORT || 3000); 
0

Я считаю, что koa-router должен делать то, что вам нужно.

var Router = require('koa-router'); 

var restApiRouter = new Router({ 
    prefix: '/api' 
}); 

restApiRouter.get('/', ...); // responds to "/api" 
restApiRouter.get('/messages', ...); // responds to "/api/messages" 

var router = new Router(); 
router.get('/', ...); // responds to "/" 

app 
    .use(restApiRouter.routes()) 
    .use(router.routes()) 
    .use(restApiRouter.allowedMethods()); 
    .use(router.allowedMethods()); 
+0

возможно, чтобы мои маршруты в отдельном файле? – chovy

+0

Это не совсем правильный ответ, в этом примере нет вложенного маршрутизатора –

0

Ну, может быть, не так, как вы ожидаете, но, по моему опыту, koa-router выполняет эту работу.

У меня нет сейчас любой проверенный код, но он должен выглядеть так

main.js

var app = require('koa')() 
 
    var port = 8080 
 
    var http = require('http') 
 
    var server = http.createServer(app.callback()) 
 
    // Import your main Router 
 
    var mainRouter = require('/app/routes/root') 
 

 
    //and use its routes and methods 
 
    app.use(mainRouter.routes()) 
 
    app.use(mainRouter.allowedMethods()) 
 

 
    server.listen(port, function(){ 
 
     console.log ('Listening on port %d, App Ready',port) 
 
    })

Главное определение маршрутизатора

/приложение/маршруты /root.js

"use strict;" 
 

 
var router = require('koa-router')(); 
 

 
router.redirect('/', 'index.html') 
 

 
router.get('/*.html', *blahblah()) 
 
// returns any html on root 
 

 
// define your admin router here 
 
var adminRouter = require(appRoot+'/app/routes/admin') 
 

 
// ..and import it into current router 
 
router.use(adminRouter.routes()) 
 
router.use(adminRouter.allowedMethods()) 
 

 
// at the end, export myself 
 
module.exports = router

И, наконец, раздел администратора маршрутизатора

/app/routes/admin.js

"use strict;" 
 

 
// define router here, adding a prefix 
 
var router = require('koa-router')().prefix('/admin/'); 
 
// redirect if no file specified 
 
router.redirect('/', 'index.html') 
 

 
router.get('*.html', function *(next){ 
 
    //do your own work 
 
    this.body = something 
 
}) 
 

 
// add More Routes, if needed 
 
router.get('api.html', function *(next){ 
 
    if (this.query['status']) 
 
     this.body = statusObject 
 
    
 
}) 
 

 
// and finally export it 
 
module.exports = router

Примечание: Все вышеперечисленное не является непосредственно исполняемым код. Это всего лишь концептуальный пример

Также обратите внимание, что вы можете использовать тонны коа-промежуточный слой (или даже написать свой собственный: это не так сложно), что, возможно, может повлиять на КоА-маршрутизатор поведения

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