使用Node搭建一个简单的Http服务器

6

开发HTTP服务器程序,需要使用到Node.js的http模块。 request 对象封装了HTTP请求,我们调用request对象的属性和方法就可以拿到所有HTTP请求的信息。 …

开发HTTP服务器程序,需要使用到Node.js的http模块。

request 对象封装了HTTP请求,我们调用request对象的属性和方法就可以拿到所有HTTP请求的信息。
response 对象封装了HTTP响应,我们操作response对象的方法,就可以把HTTP响应返回给浏览器。

实现一个最简单的Web程序hello.js,它对于所有请求,都返回hello world!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'use strict'  

//导入http模块
var http = require('http');

//创建http server 并传入回调函数

var server = http.createServer(function(request,response){
    // 回调函数接口request,response对象
    //获取http请求的method,url,
    console.log(request.method+' : ' + request.url);
    //将HTTP响应200写入response,同时设置Content-Type:text/html;
    response.writeHead(200,{'Content-Type':'text/html'});
    //将HTTP响应内容写入response;
    response.end('<h1>Hello,world!</h1>')
})

server.listen('8088');

console.log('Server is running at http:127.0.0.1:8088');

文件服务器
我们可以设定一个目录,然后让web程序变成一个文件服务器。

解析request.url中的路径,然后在本地找到对应的文件,把文件内容发送出去。

解析URL需要用到Node.js提供的url模块,用过parse()将一个字符串解析为一个url对象

1
2
3
4
5
'use strict';

var url = require('url');

console.log(url.parse('http://user:pass@host.com:8080/path/to/file?query=string#hash'));

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Url {
  protocol: 'http:',
  slashes: true,
  auth: 'user:pass',
  host: 'host.com:8080',
  port: '8080',
  hostname: 'host.com',
  hash: '#hash',
  search: '?query=string',
  query: 'query=string',
  pathname: '/path/to/file',
  path: '/path/to/file?query=string',
  href: 'http://user:pass@host.com:8080/path/to/file?query=string#hash' }

处理本地文件目录需要使用Node.js提供的path模块 ,它可以方便地构造目录:

1
2
3
4
5
6
7
8
9
10
'use strict';

var path = require('path');

// 解析当前目录:
var workDir = path.resolve('.'); // 自己文件当前的本地路径

// 组合完整的文件路径:当前目录+'pub'+'index.html':
var filePath = path.join(workDir, 'pub', 'index.html');
//  自己文件当前的本地路径/pub/index.html

使用path模块可以正确处理操作系统相关的文件路径。在window系统下,返回的路径类似于C:\Users\michael\static\index.html,这样,我们都就不用关心怎么拼接路径了。

实现一个文件服务器

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

//从命令行参数获取root目录,默认是当前目录:
var root = path.resolve(process.argv[2] || '.');
console.log('Static root dir:' + root);

//创建服务器

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
var server = http.createServer(function(request,response) {
    //获取URL的path,类似'/css/bootstrap.css'
    console.log(request.url);
     var pathname = url.parse(request.url).pathname;
     //获取对应的本地路径,类似 '/srv/www/css/bootstrap.css'
     var filepath = path.join(root,pathname);
     console.log('root= '+root);
     console.log('pathname= '+pathname);
     console.log('filepath= '+filepath);
     //获取文件状态
     fs.stat(filepath,function(err,stat) {
         if(!err && stat.isFile()){  
            //判断没有出错,且文件存在
            console.log('200 '+ request.url);
            //发送200响应
            response.writeHead(200);
            //将文件流导入response
            fs.createReadStream(filepath).pipe(response);

         } else {
             //出错了或文件不存在
             console.log('404');
             response.writeHead(404);
             response.end('404 Not Found');
         }
     })
})

server.listen(8089);
console.log('Server is running at http://127.0.0.1:8089/');

作者: huanggr

为您推荐

7

发表评论

电子邮件地址不会被公开。 必填项已用*标注