Node课堂实验手册(三)

上一个实验 中,演示 Node.JS 中的事件接口。本次实验,我们将演示建立一个简单的 HTTP 服务。

建立一个最简单的HTTP服务

Node.JS 中已经自带了对 HTTP 服务的支持,只需要引入相关的 http 包即可。建立一个名为: httpServer.js 的文件。填入一下代码:

1
2
3
4
5
6
7
8
9
var http = require('http');

http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Hello World</p>');
}).listen(3000);

console.log("HTTP server is listening at port 3000.");

从以上代码可以看到,我们使用了 http 包,并调用了包中的 createServer 方法来建立 HTTP 服务。我们使用一个回调方法来处理用户的请求,回调方法有两个参数: req - 代表http request 相关的信息,res - 代表 http 输出的相关信息。

在命令行运行:

1
node httpServer.js

然后打开浏览器,输入 localhost:3000 即可看到输出的结果。

使用 request 事件处理HTTP请求

新建一个名为: httpServerWithRequest.js 文件,在文件中填入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
var http = require('http')

var server = new http.Server();

server.on('request', function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Request Event</p>');
})

server.listen(3000);

console.log('Http server is listening at port 3000.');

注意到我们使用了 node 中的事件机制,通过监听 request 事件来处理 http 请求

处理Post的请求

在 HTTP Post 请求中,需要从 request 的 Body 中获取用户上传的参数。 新建名为: httpServerRequestPost.js 的文件,在文件中填入一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var http = require('http');
var querystring = require('querystring');
var util = require('util');

http.createServer(function(req, res) {
var post = '';

req.on('data', function(chunk) {
post += chunk;
});

req.on('end', function() {
post = querystring.parse(post);
res.end(util.inspect(post));
});

}).listen(3000);

console.log('Http server is listening at port 3000');

注意body中数据的取法

处理静态资源

对于网站中的静态资源,通常更好的方法是使用分离的Web服务器,比如:nginx, apache等。但对于小型项目,又不想增加维护成本,就可以考虑直接使用 Node.JS 来处理。

新建一个名为: httpServerStatic.js 的文件,填入一下代码:

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
var path = require('path'),
fs = require('fs');

require('http').createServer(function(req, res) {
var file = path.normalize('.' + req.url);
console.log('Trying to serve', file);

function reportError(err) {
console.log(err);
res.writeHead(500);
res.end('Internal Server Error');
}

fs.exists(file, function(exist) {
if (exist) {
fs.stat(file, function(err, stat) {
var rs;

if (err) {
return reportError(err);
}

if (stat.isDirectory()) {
res.writeHead(403); res.end('Forbidden');
} else {
rs = fs.createReadStream(file);

rs.on('error', reportError);

res.writeHead(200);
rs.pipe(res);
}
});
} else{
res.writeHead(404);
res.end('Not found');
}
});
}).listen(4000);

可以看到,实现是直接将请求的文件读入并传给客户端。

下一步

下一个实验 中,将综合前几次实验的结果,构建一个 TODO API 服务。

本文标题:Node课堂实验手册(三)

文章作者:Morning Star

发布时间:2019年11月09日 - 07:11

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/node/node-practise-manual-03/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。