nodejs http - yaokun123/php-wiki GitHub Wiki

HTTP

一、通过http模块构建一个简单的http服务程序

步骤:
1、加载http模块
var http = require('http');
2、创建http服务
var server = http.createServer();
3、监听用户的请求时间(require事件)
server.on('request',function(request,response){
    //request 对象包含了用户请求报文中的的所有内容,通过request对象可以获取所有用户提交过来的数据。
    //response 对象用来向用户响应一些数据,当服务器要向客户端响应数据的时候必须使用response对象。
    //有了request 和 response 对象,就既可以获取用户提交的数据,也可以向用户响应数据了。

    //body
    response.write('Hello World!!!');

    //对于每一个请求,服务器必须结束响应,否则客户端(浏览器)会一直等待服务器响应结束。
    response.end();
})
4、启动服务
server.listen(8080,function(){
    console.log('服务器启动了,请访问:localhost:8080');
})

二、通过服务器端设置响应报文头来解决乱码问题

var http = require('http');
var server = http.createServer();
server.on('request',function(request,response){

    //解决乱码的思路:服务器通过设置 http 响应报文头,告诉浏览器使用相应的编码来解析网页
    response.setHeader('Content-Type','text/plain;charset=utf-8');

    response.write('Hello World!!!你好世界!');//此时中文会有乱码问题
    response.end();
}
server.listen(8080,function(){
    console.log('服务器启动了,请访问:localhost:8080');
})

三、通过设置http响应报文头来解决浏览器显示html的问题

var http = require('http');
var server = http.createServer();
server.on('request',function(request,response){

    //解决乱码的思路:服务器通过设置 http 响应报文头,告诉浏览器
    response.setHrader('Content-Type','text/html;charset=utf-8');

    response.write('<h1>Hello World!!!你好世界!</h1>');
    response.end();
}
server.listen(8080,function(){
    console.log('服务器启动了,请访问:localhost:8080');
})

四、构建http服务程序 - 根据不同请求做出不同响应

var http = require('http');
var server = http.createServer();
server.on('request',function(request,response){
    //request.url可以获取用户请求路径,根据不同的请求路径服务器做出不同的响应
    console.log(request.url);
    if(request.url=='/' || request.url=='/index'){
          res.end('Hello Index!');
    }else if(request.url=='/login'){
        res.end('Hello Login');
    }else if(request.url == '/register'){
        res.end('Hello Register!');
    }else{
        response.end('404,not Found!');
    }
}
server.listen(8080,function(){
    console.log('服务器启动了,请访问:localhost:8080');
})

五、根据用户不同请求-读取不同html文件、图片

var http = require('http');
var path = require('path');
var fs = require('fs');
var server = http.createServer();
server.on('request',function(request,response){
    if(request.url=='/' || request.url=='/index'){
        fs.readFile(path.join(__diename,'htmls','index.html'),function(err,data){
            if(err,data){
                throw err;
            }
            response.end(data);
        })
    }else if(request.url=='/images/index.png'){
        fs.readFile(path.join(__diename,'images','index.png'),function(err,data){
            if(err,data){
                throw err;
            }
            response.setHeader('Content-Type','image/png');//带图片的
            response.end(data);
        })
    }else if(request.url == '/css/index.css'){
         fs.readFile(path.join(__diename,'css','index.css'),function(err,data){
            if(err,data){
                throw err;
            }
            response.setHeader('Content-Type','text/css');//带css的
            response.end(data);
        })
    }else{
        //...
    }
}
server.listen(8080,function(){
    console.log('服务器启动了,请访问:localhost:8080');
})

六、模拟Apache服务器

var http = require('http');
var path = require('path');
var fs = require('fs');
var mime = require('mime');

http.createServer(function(req,res){
    var publicDir = path.join(__dirname,'public');

    var filename = path.join(publicDir,req.url);

    fs.readFile(filename,function(err,data){
        if(err){
            res.end('文件不存在 404');
        }
        //通过第三方模块mime,来判断不同的资源对应的Content-Type的类型(npm install mime)
        res.setHeader('Content-Type',mime.getType(filename));
        res.end(data);
    });
}).listen(9090,function(){
    console.log('http://localhost:9090');
})

注意:对于服务器来说请求url就是一个标识符

七、request对象 和 response对象

request(http.IncomingMessage): 服务器解析用户提交的http请求报文,将结果解析到request对象中。
凡是要获取和用户请求相关的数据都可以通过request对象对象获取。
常用成员:
request.headers//键值对的形式
request.rawHeaders//数组的形式
request.httpVersion
request.method
request.url

response(http.ServerResponse):在服务器端用来向用户做出响应的对象。
凡是需要向用户(客户端)响应的操作,都需要通过 response 对象来进行。
常用方法:
response.write()
response.setHeader()
response.end()
response.writeHead()
response.statusCode = 404
response.statusMessage = 'Not Found'

八、npm

npm(node package manager,即node包管理器)

npm是node.js默认的软件包管理系统,安装完毕node后,会默认安装好npm

npm本身也是基于node.js开发的包(软件)

查看当前npm版本:npm -v
更新npm:npm install npm@latest -g//更新最新的。-g指的是全局安装(把这个模块全局安装之后,就可以将其作为命令行使用了)

全局安装只是为了可以当做命令行工具使用

常用命令:
install:安装包
uninstall:卸载包
version:查看当前版本
init:创建一个package.json文件。npm init

九、模块(Modules)和 包(Packages)的区别

1、模块可以是任何一个文件或目录(目录下可以有很多个文件),只要能被node.js通过require()即可

2、包是一个文件或目录(目录下可以有多个文件)必须有一个package.json文件来描述,就可以是一个包。

package.json就是一个包描述文件或项目描述文件-元数据
{"name":"包的名称(必须有)","version":"版本号(必须有)",....}

package-lock.json并不是每个人都会看到,npm5开始引进新的东西,为了让安装速度变快(第一次安装第三方包的时候才会产生)

十、获取用户提交的get数据。url模块parse()

要获取用户get提交的数据,需要用到url模块(这个模块是node.js内置模块,不是第三方模块)

既然是get提交数据,可以通过request.url就可以直接获取这些数据,但是这样使用起来不方便(得自己去截取字符串,然后获取想要的数据)

通过url模块,可以将用户get提交的数据解析成一个 json 对象,使用起来很方便。

十一、重定向

response.statusCode = 302;
response.statusMessage = 'Found';
response.setHeader('Location','/');
response.end();

十二、获取用户提交的post数据

因为post提交数据的时候,数据量可能比较大,所以会分多次进行提交,每次提交一部分数据。 因此,想要在服务器中获取用户提交的所有数据,就必须监听request事件的data事件。 因为每次浏览器提交一部分数据到服务器 那么,什么时候才表示浏览器把所有的数据都提交到服务器了呢? 就是当request对象的end事件被触发的时候。

var arr = [];
request.on('data',function(chunk){
    //此处的chunk参数,就是浏览器本次提交过来的一部分数据
    //chunk的数据类型是Buffer(chunk就是一个Buffer对象)
    arr.push(chunk);
})

//监听request对象的end事件
//当end事件被触发的时候,表示所有数据都已经提交完毕
request.on('end',function(){
    //在这个事件中只要把arr中的数据汇总起来就好了
    //把arr中的每个buffer对象,集合起来转换为一个buffer对象
 
    var postBody = BUffer.concat(arr);
    
    //把获取到的buffer对象转换为一个字符串
    postBody = postBody.toString('utf-8');

    //把post请求的查询字符串,转换为一个 json 对象
    //var querystring = require('querystring');
    postBody = querystring.parse(postBody);
})

十三、工具函数库underscore使用

template(templateString,[settings]);//模版引擎

var _ = require('underscore');

var html = '<h2><%= name %></h2>';

var fn = _.template(html);

var text = fn({'name' : '哈哈'});
⚠️ **GitHub.com Fallback** ⚠️