Как я могу разделить маршруты koa на отдельные файлы?
Я пытаюсь понять, как разделить маршруты на отдельные файлы.
У меня это до сих пор, но это не работает. Я просто получаю Not found
, когда пытаюсь получить доступ к http://localhost:3001/api/things
//server.js
var koa = require('koa');
var app = koa();
var router = require('koa-router');
app.use(router(app));
require('./routes')(app);
// routes.js
module.exports = function *(app){
app.use('/api/things', require('./api/things'));
};
// api/things/index.js
var Router = require('koa-router');
var router = new Router({
prefix: '/api/things'
});
router.get('/', function *(){
this.body = [{ name: 'Foo'}, { name: 'Bar' }];
});
module.exports = router;
Ответы
Ответ 1
Для тех, кто читает это, кто интересуется, как это сделать в Koa 2.X:
app.js
import Koa from 'koa'
import rootRouter from './routes/root'
import userRouter from './routes/user'
const app = new Koa()
app.use(rootRouter.routes())
app.use(rootRouter.allowedMethods())
app.use(userRouter.routes())
app.use(userRouter.allowedMethods())
export default app
<сильные > маршруты /root.js
import Router from 'koa-router'
const router = new Router()
router.get('/', async (ctx, next) => {
ctx.body = 'Hello'
})
export default router
маршруты /user.js
import Router from 'koa-router'
const router = new Router({ prefix: '/user' })
router.get('/', async (ctx, next) => {
ctx.body = 'Some User'
})
export default router
Если вы хотите избежать повторения с помощью routes()
и allowedMethods()
, вы можете использовать koa-compose
для создания промежуточного программного обеспечения вместе. Для простоты я сделал вокруг обертку, чтобы упростить работу с koa-router
. Использование этого будет выглядеть примерно так:
app.js
import Koa from 'koa'
import router from './routes'
const app = new Koa()
app.use(router)
export default app
маршруты /index.js
import combineRouters from 'koa-combine-routers'
import rootRouter from './root'
import userRouter from './user'
const router = combineRouters([
rootRouter,
userRouter
])
export default router
И он будет делать то же самое.
Ответ 2
server.js
var app = require('koa')();
var router = require('./routes');
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);
routes.js
var router = require('koa-router')();
router.get('/', function* () {
this.body = 'router test';
});
module.exports = router;
Ответ 3
Что-то вроде этого должно работать:
// app.js
var koa = require('koa'),
app = koa();
require('./routes1')(app);
require('./routes2')(app);
app.listen(3000);
// routes1.js
var Router = require('koa-router');
function register (app) {
var router = new Router({
prefix: '/api'
});
router.get('/', ...); // responds to "/api"
router.get('/messages', ...); // responds to "/api/messages"
app.use(router.routes());
app.use(router.allowedMethods());
}
module.exports = register
// routes2.js
var Router = require('koa-router');
function register (app) {
var router = new Router();
router.get('/', ...); // responds to "/"
app.use(router.routes());
app.use(router.allowedMethods());
}
module.exports = register
Ответ 4
Вот что я закончил:
//server.js
'use strict';
var koa = require('koa');
var app = koa();
var serve = require('koa-static');
var path = require('path');
var router = require('koa-router');
var cfg = require('./config');
var mw = require('./middleware');
app.use(serve(path.resolve(__dirname, '../client')));
app.use(mw.requestTime('Response-time'));
app.use(router(app));
app.use(cfg.db.connect);
require('./routes')(app);
app.get('/api', function *(){
this.body = 'Welcome to API v1';
});
app.use(cfg.db.close);
app.listen(cfg.env.port);
//routes.js
module.exports = function (app){
app.use(require('./api/things').routes());
};
// api/things/index.js
var Router = require('koa-router');
var router = new Router({
prefix: '/api/things'
});
var ctrl = require('./controllers');
router.get('/', ctrl.list);
router.get('/:id', ctrl.get);
router.post('/', ctrl.post);
router.put('/:id', ctrl.put);
router.del('/:id', ctrl.del);
module.exports = router;
// api/things/controllers.js
var r = require('rethinkdb');
var http = require('http');
var parse = require('co-body');
var ctrl = module.exports = {};
ctrl.list = function *(next){
};
ctrl.get = function *(next){
};
ctrl.post = function *(next){
};
ctrl.put = function *(next){
};
ctrl.del = function *(next){
};
Ответ 5
Минималистический подход, который я считаю TJ, когда он делал
koa, koa-route, koa-mount
Подходите к небольшим независимым приложениям, которые настраиваются так, как вам нравится:
index.js
var app = require('./app')
app.listen(3000);
app.js
const Koa = require('koa')
const _ = require('koa-route')
const mount = require('koa-mount')
const app = new Koa()
const pets = require('./pets')
// sub apps
app.use(mount('/pets', pets))
// root app
app.use(_.get('/', function(){
this.body = "hello";
}))
module.exports = app;
pets.js
var Koa = require('koa');
var _ = require('koa-route');
var app = new Koa();
app.use(_.get('/', ctx => ctx.body = "pets" ));
app.use(_.get('/:name', (ctx, name) => ctx.body = "pet: "+ name));
module.exports = app;