Node.js Web开发(二)

上一篇文章主要介绍了koa2的基本操作(坐下坐下),但是每次都返回一样的HTML似乎也不可能,所以现在我们需要来处理URL了。

直接来点高级点的东西,我们需要一个能处理URL的middleware,它叫做:koa-router:

npm install koa-router

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const Koa = require('koa');
const router = require('koa-router')();
const app = Koa();
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 Page</h1>';
});
// add router middleware
app.use(router.routes());
app.listen(3000);
console.log('Server listen on port 3000...');

这里的代码,会在访问网址localhost:3000时返回Index Page,而在访问localhost:3000/hello/louis的时候,显示的就是Hello, louis!了,这样router就为我们达到了处理URL的功能。注意一下,在引入router的时候,是多一个括号的,这说明我们引入的router是一个对象,而前面Koa引入的其实是一个类(所以它被大写了~)。


处理POST请求

router.get()处理的是HTTP的GET请求,但是除了GET请求,我们还经常会碰到POST请求(比如在注册一个用户啊,或者新增一篇推文的时候),这就需要用到router.post()的方法。不过,post请求的内容,通常作为request的body进行发送,而Node.js和koa都不具备解析这个body的功能,所以,这里我们就要用到另一个非常有用的middleware: koa-bodyparser

npm install koa-bodyparser

1
2
3
4
5
6
7
const bodyParser = require('koa-bodyparser');
app.use(bodyParser());
// bodyParser要在router前被注册到app上
app.use(router.routes());
...

现在,我们就可以处理POST的请求了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
router.get('/', async (ctx, next) => {
ctx.response.body = `<h1>Index Page</h1>
<form action="/signin" method="post">
<p>Name: <input name="name" value="snow"></p>
<p>Password: <input type="password" name="password"></p>
<p><input type="submit" value="submit"></p>
</form>`;
});
router.post('/signin', async(ctx, next) => {
var
name = ctx.request.body.name || '',
password = ctx.request.body.password || '';
console.log(`login with name: {$name} and password: {$password}...`);
if (name === 'snow' && password === '117'){
ctx.response.body = `<h1>Welcome, {$name}!</h1>`;
} else {
ctx.response.body = `<h1>Login failed.</h1>
<p><a href="/">Try again</a></p>`;
}
});

注意这里的name和password的写法,如果不存在的话,默认为 ‘’,也不会报错的。