【问题标题】:Expressjs to Koajs - routing and templates?Expressjs 到 Koajs - 路由和模板?
【发布时间】:2017-08-11 09:54:24
【问题描述】:

我希望将我的 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 中是如何做到的呢?

有什么想法吗?

【问题讨论】:

    标签: node.js express koa


    【解决方案1】:

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

    根据您的需要,您似乎想考虑使用koa-routerkoa-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 的信息。

    【讨论】:

    • 糟糕,有一个错字。它应该是ctx.render,是ctx.response.render 的别名,而不是res.render
    • 我使用ctx.render,它给了我同样的结果。
    • 澄清一下,同样的结果是指它有效还是无效?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2018-04-26
      • 1970-01-01
      相关资源
      最近更新 更多