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.path
和 ctx.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 中,你不会得到 req
和 res
作为参数,你只会得到一个 ctx
。使用此 ctx
对象,您可以通过 ctx.request
访问请求并使用 ctx.response
访问响应。 ctx.body
只是 ctx.response.body
的别名。 Koa 给你定义了很多别名,你可以看看here.
我想将我的 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.path
和 ctx.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 中,你不会得到 req
和 res
作为参数,你只会得到一个 ctx
。使用此 ctx
对象,您可以通过 ctx.request
访问请求并使用 ctx.response
访问响应。 ctx.body
只是 ctx.response.body
的别名。 Koa 给你定义了很多别名,你可以看看here.