用nodejs和es7的async/await实现简单http server

前言

在有些场景中, 并不需要处理复杂的业务逻辑, 可能只需要一个简单的http接口, 用来执行一些简单的功能; 此时可尝试下nodejs的原生http来搭建server. 运行这样一个http server所需要的仅仅是一个nodejs的环境. 然后借助于灵活的js语言和对JSON的原生支持. 可快速的实现一些原型. (例如我用来处理coding的WebHook)

nodejs的安装非常简单, 比如在linux环境下, 可直接wget官方的压缩包, 配上环境变量即可.

概念解读

Promise是javascript中针对异步编程的一种解决方案, 他可以使得异步代码清晰易读, 避免落入回调地狱; Promise在ES6中已被原生支持.
async/await是ES7中的语法特性. 对Promise进行了进一步的封装. 在语法层面支持Promise的特性.
http模块是nodejs中的内置的模块, 可以用来作为http服务端或者客户端.

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const http = require('http');

const server = http.createServer((request, response) => {
switch (request.url) {
case '/ping':
response.end('pong');
break;
default:
defaultController(request, response);
}
});
server.listen(8124);

async function defaultController(request, response) {
const ip = request.socket.remoteAddress,
port = request.socket.remotePort,
method = request.method,
headers = request.headers,
url = request.url;

let rawData = await getRawData(request);

let respData = '';
respData += 'Client info:\n'
respData += ` Client IP: ${ip}\n`
respData += ` Client Port: ${port}\n`
respData += '\n'
respData += 'Request info:\n'
respData += ` url: ${url}\n`
respData += ` headers['content-type']: ${headers['content-type']}\n`
respData += ` rawData: ${rawData}`
response.writeHead(200, { 'Content-Type': 'text-plain' });
response.end(respData);
}

async function getRawData(request) {
return new Promise((resolve, reject) => {
let rawData = '';
request.on("data", (chunk) => { rawData += chunk });
request.on("end", () => {
return resolve(rawData)
});
});
}

可以看出, 使用async/await后, 代码风格接近同步, 没有了回调嵌套.

好文参考

Promise原理
async/await
nodejs之http

0%