如何将我的koa路线拆分为单独的文件?

cho*_*ovy 25 node.js koa koa-router

我想弄清楚如何将我的路线拆分成单独的文件.

到目前为止,我有这个,但它不起作用.我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;
Run Code Online (Sandbox Code Playgroud)

saa*_*adq 44

对于读这篇文章的人来说,谁对如何在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
Run Code Online (Sandbox Code Playgroud)

路线/ root.js

import Router from 'koa-router'
const router = new Router()

router.get('/', async (ctx, next) => {
  ctx.body = 'Hello'
})

export default router
Run Code Online (Sandbox Code Playgroud)

路线/ 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
Run Code Online (Sandbox Code Playgroud)

如果你想避免重复使用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  
Run Code Online (Sandbox Code Playgroud)

路线/ index.js

import combineRouters from 'koa-combine-routers'
import rootRouter from './root'
import userRouter from './user'

const router = combineRouters(
  rootRouter,
  userRouter
)

export default router
Run Code Online (Sandbox Code Playgroud)

它会做同样的事情.


小智 16

server.js

var app = require('koa')();
var router = require('./routes');
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

routes.js

var router = require('koa-router')();
router.get('/', function* () {
    this.body = 'router test';
});
module.exports = router;
Run Code Online (Sandbox Code Playgroud)


Jam*_*ore 11

这样的事情应该有效:

// 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
Run Code Online (Sandbox Code Playgroud)


Lav*_*dor 5

对于Koa 2.x,我发现了带前缀的嵌套路线来交付货物,没有其他包裹。

假设/ api / dogs/ api / cats是必需的结果。

像这样:

app.js

import Koa from 'koa';
import Router from 'koa-router';
import apiRouter from './routes/apiRouter';

const app = new Koa();

app.use(apiRouter.routes(), apiRouter.allowedMethods());

app.listen(3000);

export default app;
Run Code Online (Sandbox Code Playgroud)

路线/apiRouter.js

import Router from 'koa-router'

import dogsRouter from './dogsRouter'
import catsRouter from './catsRouter'

const apiRouter = new Router({ prefix: '/api' })

const nestedRoutes = [dogsRouter, catsRouter]
for (var router of nestedRoutes) {
    apiRouter.use(router.routes(), router.allowedMethods())
}

export default apiRouter;
Run Code Online (Sandbox Code Playgroud)

路由/狗Router.js

import Router from 'koa-router'

const dogsRouter = new Router({ prefix: '/dogs' });

dogsRouter.get('/', async (ctx, next) => {
  ctx.body = 'Dogs be here'
});

export default dogsRouter;
Run Code Online (Sandbox Code Playgroud)

路由/猫Router.js

import Router from 'koa-router'

const catsRouter = new Router({ prefix: '/cats' });

catsRouter.get('/', async (ctx, next) => {
  ctx.body = 'Cats be here'
});

export default catsRouter;
Run Code Online (Sandbox Code Playgroud)