处理url

简介: 处理url

疑问

在hello-koa工程中,我们处理http请求一律返回相同的HTML,这样虽然非常简单,但是用浏览器一测,随便输入任何URL都会返回相同的网页。

正常情况下,我们应该对不同的URL调用不同的处理函数,这样才能返回不同的结果。例如像这样写:

app.use(async (ctx, next) => {
    if (ctx.request.path === '/') {
        ctx.response.body = 'index page';
    } else {
        await next();
    }
});
app.use(async (ctx, next) => {
    if (ctx.request.path === '/test') {
        ctx.response.body = 'TEST page';
    } else {
        await next();
    }
});
app.use(async (ctx, next) => {
    if (ctx.request.path === '/error') {
        ctx.response.body = 'ERROR page';
    } else {
        await next();
    }
});


这么写是可以运行的,但是好像有点蠢。

应该有一个能集中处理URL的middleware,它根据不同的URL调用不同的处理函数,这样,我们才能专心为每个URL编写处理函数。

koa-router

为了处理URL,我们需要引入koa-router这个middleware,让它负责处理URL映射。

我们把上一节的hello-koa工程复制一份,重命名为url-koa。

先在package.json中添加依赖项:

"koa-router": "7.0.0"
1.

然后用npm install安装。

接下来,我们修改app.js,使用koa-router来处理URL:

const Koa = require('koa');
// 注意require('koa-router')返回的是函数:
const router = require('koa-router')();
const app = new Koa();
// log request URL:
app.use(async (ctx, next) => {
    console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);
    await next();
});
// add url-route:
router.get('/hello/:name', async (ctx, next) => {
    var name = ctx.params.name;
    ctx.response.body = `<h1>Hello, ${name}!</h1>`;
});
router.get('/', async (ctx, next) => {
    ctx.response.body = '<h1>Index</h1>';
});
// add router middleware:
app.use(router.routes());
app.listen(3000);
console.log('app started at port 3000...');


注意导入koa-router的语句最后的()是函数调用:

const router = require('koa-router')();
1.

相当于:

const fn_router = require('koa-router');
const router = fn_router();

然后,我们使用router.get('/path', async fn)来注册一个GET请求。可以在请求路径中使用带变量的/hello/:name,变量可以通过ctx.params.name访问。

再运行app.js,我们就可以测试不同的URL:

输入首页:http://localhost:3000/

image.png

image.png

相关文章
|
1月前
URL和URI
URL和URI
29 0
|
11月前
|
安全 数据安全/隐私保护
什么是URL?
什么是URL?
101 0
|
4月前
|
存储 前端开发 JavaScript
url的组成
url的组成
83 0
|
XML 安全 搜索推荐
URL地址
一个完整的URL的组成部分是啥?实际意义又是啥?还不赶紧来看看!
237 0
URL后面#号的问题
前几天测试在对于我写的接口进行测试的时候遇到了这样一个问题
|
域名解析 网络协议 Windows
浅析URL
浅析URL
161 0
浅析URL
|
网络协议 网络架构 开发者
浅析 URL
浅析 URL
124 0
URL 解析
URL 解析
231 0
|
网络协议
URL
HTTP协议是一个超文本传输协议 HTTP协议是一个基于TCP传输协议传输数据的 HTTP协议规定了浏览器和 Web 服务器通信数据的格式
317 0