Node.js学习(四)网络服务器

学习视频
Node.js学习(一)介绍
Node.js学习(二)异步、缓存区、文件系统
Node.js学习(三)常用模块与网络爬虫

服务器入门

/**
 * node.js服务器:
 *      1.引入通信模块
 *      2.创建服务器
 *      3.监听request事件
 *      4.监听端口
 * 
 *      访问服务器:
 *          1)打开浏览器
 *          2)输入网址
 *              127.0.0.1   本地地址
 *              localhost   当前主机,本地域名
 *              局域网IP 
 *
 */
var http=require('http');
//创建服务器
var server=http.createServer();
//监听request请求事件,当前请求事件发生时就返回数据
server.on('request',function(req,res){
    //req:请求对象,包含了所有客户端请求的数据,请求头、请求主体
    //res:响应对象,包含了所有服务器端发给客户端的数据,响应头、响应主体
    res.write('<h1>Hello Node.js</h1>');
    res.write('<p>hello</p>');
    res.end();
})
//监听服务器的1111端口
server.listen(1111,function(){
    console.log('服务器已运行。。。')
})

http响应内容

需求:根据用户的请求地址(url),响应不同的网页

/**
 * 网页响应内容:
 *      可以根据用户请求的url不同,判断响应不同的数据,实现访问不同的url得到不同的结果。
 *      核心:res.url   获取到用户请求的网址
 */
var http=require('http');
//创建服务器
var server=http.createServer();
//监听request请求事件,当前请求事件发生时就返回数据
server.on('request',function(req,res){
    //req:请求对象,包含了所有客户端请求的数据,请求头、请求主体
    //res:响应对象,包含了所有服务器端发给客户端的数据,响应头、响应主体
    if(req.url==='/'){
        res.write('<h1>homes</h1>');
    }
    if(req.url==='/news.html'){
        res.write('<h1>news</h1>');
    }
    if(req.url==='/about.html'){
        res.write('<h1>about</h1>');
    }
    res.end();
})
//监听服务器的1111端口
server.listen(1111,function(){
    console.log('服务器已运行。。。')
})

http状态码

http现已规定的服务器响应数据时的状态编码,就是状态码

  1. 常用状态码
  • 1xx:表示普通消息,没有特殊含义
  • 2xx:表示服务器响应成功
    200:成功
  • 3xx:表示重定向
    301:永久重定向
    302:临时重定向
    304:使用缓存(服务器没有更新过)
  • 4xx:无法访问
    403:权限不足,无法访问
    404:资源找不到
  • 5xx:服务器有错
    500:服务器端代码有错
    502:网关错误
    503:服务器已崩溃
  1. 状态码使用
    res.writeHead(状态码,响应头对象)
    例:res.writeHead(200,{"Content-Type":"text-html; charset=utf-8"})

  2. 响应头

  • Content-Type:响应的文件类型
    注意:未指定响应文件的类型时,默认是html,编码默认是系统编码
  • Content-Length:响应内容的长度
  • Access-Control-Allow-Origin:设置响应头可以跨域

MIME类型

  1. 什么是MIME类型
    MIME类型可以认为是文件类型的表述
  2. 常用的MIME类型
.txt	text/plain
.html	text/html
.css	text/css
.js		text/javascript
.png	image/png
.jpg	image/jpeg
.gif	image/gif
.json	text/json	application/json
.mp3	audio/mpeg	
.mp4	video/mpeg
.pdf	application/pdf
.xml	text/xml
.zip	application/x-gzip
var http=require('http');
//创建服务器
var server=http.createServer();
//监听request请求事件,当前请求事件发生时就返回数据
server.on('request',function(req,res){
    res.writeHead(200,{
    	//"Content-Type":"text-html; charset=utf-8"	//生成一个html网页
    	//"Content-Type":"text-plain; charset=utf-8"	//生成一个普通文本
    	"Content-Type":"application/x-gzip"	//生成一个压缩包,浏览器自动下载
    })
    res.write('<h1>homes</h1>');
    res.end();
})
//监听服务器的1111端口
server.listen(1111,function(){
    console.log('服务器已运行。。。')
})

制作一个静态网页服务器

var http=require('http');
var fs=require('fs');
var path=require('path');
//创建服务器
var server=http.createServer();
//监听request请求事件,当前请求事件发生时就返回数据
server.on('request',function(req,res){
    if(req.url==='/'){
        req.url='/index.html';//制作一个默认首页
    }
    var fn='./www'+req.url;
    var ext=path.extname(fn);
    var exts={".html":"text/html",".css":"text/css",".jpg":"image/jpeg"};
    fs.readFile(fn,function(err,data){
        if(err){
            res.writeHead(400,{"Content-Type":"text/html; charset=utf-8"});
            res.write('资源找不到');
            res.end();
        }else{
            res.writeHead(200,{"Content-Type":exts[ext]+"; charset=utf-8"});
            res.write(data+'');
            res.end();
        }
        
    })
})
// 监听服务器的1111端口
server.listen(1111,function(){
    console.log('服务器已运行。。。')
})

接收数据

客户端向服务器传递数据:

  • GET方式
    在URL后面添加? 写键值对形式就是GET方式传数据
    只要可以写url的地方就可以在后面加?传参数
    在node.js可以接收到客户端传过来的参数值
  • POST方式
    只有form表单可以实现POST方式提交,POST方式提交的数据在请求主体
var http=require('http');
var server=http.createServer();
server.on('request',function(req,res){
	//GET请求
    //通过req.url后面参数字符串的解析,分析出传的参数和值
    var query=req.url.split('?');
    var value=query[1].split('=');
    res.writeHead(200,{"Content-Type":"text/html; charset=utf-8"});
    res.write('<h1>传的参数值为:'+value+'</h1>');
    res.end();
    
    //POST请求
    //定义一个动态页面
    if(req.utl=='action.html'){
        //从req请求主体中获取到POST方式提交的数据
        var query='';
        req.on('data',function(){
            query+=arguments.toString();
        });
        req.on('end',function(){
            res.writeHead(200,{"Content-Type":"text/html; charset=utf-8"});
            res.write('<h1>我们已经收到了请求</h1>')
            res.write('<h1>接收到的数据是'+query+'</h1>')
            res.end();
        })
    }
})
server.listen(1111,function(){
    console.log('服务器已运行...');
})

动态网页模板

  1. 什么是模板?
    将一些固定的结构或表现直接以静态文件形式存储,将需要表现成动态数据的地方使用模板语法进行编写,再使用模板引擎读取该静态文件,将动态的数据进行替换进去,最终实现产生出一个动态的页面。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <link type="text/css" rel="stylesheet" href="css/style.css">
</head>
<body>
    <h1>访问IP为:<%=ip%></h1>
</body>
</html>
var http=require('http');
var fs=require('fs');
var server=http.createServer();
function render(data,ip){
    return data.replace('<%=ip%>',ip);
}
server.on('request',function(req,res){
    var ip=req.socket.remoteAddress;//获取用户的IP地址
    fs.readFile('./www/temple.html',function(err,data){
        res.writeHead(200,{"Content-Type":"text/html; charset=utf-8"});
        res.write(render(data.toString(),ip));
        res.end();
    })
})
server.listen(1111,function(){
    console.log('服务器已运行。。。')
})

版权声明:本文为hmyhicc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。