Expressjs 到 Koajs - 路由和模板?

Expressjs to Koajs - routing and templates?

我想将我的 Express 应用程序迁移到 Koa,但我不知道如何让路由和模板在 Koa 中工作。似乎在他们的官方网站上有关于此的文档。

例如,这就是我在 Express 中的做法:

var express = require('express');
var app = express();

// respond with "Hello World!" on the homepage
app.get('/', function (req, res) {
    res.send('Hello World!');
});

// accept POST request on the homepage
app.post('/', function (req, res) {
    res.send('Got a POST request');
});

// accept PUT request at /user
app.put('/user', function (req, res) {
    res.send('Got a PUT request at /user');
});

// accept DELETE request at /user
app.delete('/user', function (req, res) {
    res.send('Got a DELETE request at /user');
})

那么在 Koa 中是如何完成的呢?我从他们的文档中得到了什么:

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World';
});

app.listen(3000);

此外,在模板渲染方面,在 Express 中:

var express = require('express');
var router = express.Router();

router.get("/make", function(req, res) {

    return res.render("streams/make", {...});
});

那么,这在 Koa 中是如何完成的?

有什么想法吗?

Koa 不提供这种开箱即用的东西 - 它被设计为比 Express 低一点。

您需要手动编写自己的中间件处理路由(通过 ctx.pathctx.method)和模板(从 NPM 获取模板引擎并渲染到 ctx.body) , 或使用 one of the many pre-built solutions.

正如 Joe 已经提到的,Koa 没有预装任何中间件。

根据您的需要,您似乎想要研究使用 koa-router and koa-views

用法:

app.js

const Koa = require('koa')
const views = require('koa-views')
const router = require('./routes')

const app = new Koa()

app.use(views(`${__dirname}/views`, { extension: 'pug' })) // You can replace 'pug' with whatever templating engine you're using.
app.use(router.routes())
app.use(router.allowedMethods())

app.listen(3000)

module.exports = app

routes.js

const Router = require('koa-router')

const router = new Router()

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

// accept POST request on the homepage
router.post('/', async ctx => {
  ctx.body = 'Got a POST request'
})

// accept PUT request at /user
router.put('/user', async ctx => {
  ctx.body = 'Got a PUT request at /user'
})

// accept DELETE request at /user
router.delete('/user', async ctx => {
  ctx.body = 'Got a DELETE request at /user'
})

// Render a template
router.get("/make", async ctx => {
  await ctx.render("streams/make", { ... });
})

module.exports = router

在 Koa 中,你不会得到 reqres 作为参数,你只会得到一个 ctx。使用此 ctx 对象,您可以通过 ctx.request 访问请求并使用 ctx.response 访问响应。 ctx.body 只是 ctx.response.body 的别名。 Koa 给你定义了很多别名,你可以看看here.