Koa.js 是否有 Express 样式的嵌套路由器?
Is there a Express-style nested router for Koa.js?
是否有提供 Express 式嵌套路由器的库?像这样:
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);
如果没有,在其他文件中封装公共路径路由的最佳做法是什么?
我相信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());
之前的回答没有准确说明如何嵌套路由器。这是一个真实世界的例子,分成几个控制器文件。
首先,我们将一些 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);
好吧,也许与您预期的不完全一样,但是根据我的经验,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)
})
主路由器定义
/app/routes/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
注意:以上所有都不是直接可运行的代码。这只是一个概念性的例子
另请注意,您可以使用大量可能会影响 koa-router 行为的 koa-middleware(甚至编写自己的中间件:这并不难)
是否有提供 Express 式嵌套路由器的库?像这样:
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);
如果没有,在其他文件中封装公共路径路由的最佳做法是什么?
我相信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());
之前的回答没有准确说明如何嵌套路由器。这是一个真实世界的例子,分成几个控制器文件。
首先,我们将一些 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);
好吧,也许与您预期的不完全一样,但是根据我的经验,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)
})
主路由器定义
/app/routes/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
注意:以上所有都不是直接可运行的代码。这只是一个概念性的例子
另请注意,您可以使用大量可能会影响 koa-router 行为的 koa-middleware(甚至编写自己的中间件:这并不难)