node--服务器功能实现

两种方式实现:

const http = require('http');
 //创建服务器对象
 http.createServer((request,response)=>{
     // write向客户端返回数据
     response.write('Hello world!');
   response.write('Hello kitty!');
     // 完成响应,end不可以省略,否则客户端无法获取响应数据
     response.end('Hello Tom');
     // listen用来监听服务器IP和端口
 }).listen(3000,'192.168.99.1',()=>{
     // 服务器启动之后调用该方法
    console.log('running......');
 });

// 创建服务器对象
let server = http.createServer();
// 监听客户端的请求
server.on('request',(req,res)=>{
    // 响应客户端的请求,响应完成时也可以同时返回数据
    res.end('Hello Jerry');
});
// 监听指定端口和IP地址
server.listen(3000,'192.168.99.1',()=>{
    // 服务器启动之后调用该方法
    console.log('running........');
});

细节分析:

const http = require('http');
// req 是Class: http.IncomingMessage的实例对象,用来获取请求相关的信息
// res 是Class: http.ServerResponse的实例对象,用来相应客户请求设置相关信息
http.createServer((req,res)=>{
    // 请求头信息
    // console.log(req.headers);
    // 请求URL
    // console.log(req.url);

    // 根据URL的不同可以返回不同的内容(路由)
    if(req.url.endsWith('index.html')){
        res.end('index.html');
    }else if(req.url.endsWith('about.html')){
        res.end('about.html');
    }else{
        res.end('list.html');
    }

}).listen(3000,()=>{
    console.log('running.....');
});

根据请求的url地址,实现静态服务器功能:

const http = require('http');
const path = require('path');
const fs = require('fs');
const mime = require('./mime.json');//对应的扩展名
let staticDir = '/www';             
let info404 = `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>404</title>
</head>
<body>
    <div>页面消失不见了</div>
</body>
</html>
http.createServer((req,res)=>{
    // 根据URL地址读取对应文件的内容然后返回客户端
    if(req.url.startsWith(staticDir)){
        let filename = path.basename(req.url);
        fs.readFile(path.join(__dirname,staticDir,filename),(err,data)=>{
         if(err){
                res.end(info404);
                return ;
            }
            // 获取URL中文件的扩展名
            let ext = path.extname(req.url);
            // 设置响应类型的默认值
            let cType = 'text/html';
            // 如果请求的文件格式存在就覆盖默认值,不存在就是使用默认值
            if(mime[ext]){
                cType = mime[ext];
            }
            //文本文件需要指定编码,图片不需要
            if(mime[ext].startsWith('text')){
                cType += '; charset=utf8'
            }
            // 设置响应头信息
            res.writeHead(200,{
                'Content-Type':cType
            })
            // 完成响应并返回内容
            res.end(data);
        });
    }

}).listen(3000,()=>{
    console.log('running......');
});

url参数解析:
url.parse() ,利用这种方法就可以取得url地址参数,即get方法

onst url = require('url');

// let str = 'http://www.baidu.com:8080/abc/qqq/ddd?key=123&word=javascript#id';
// let str = '//foo/bar';
// 第一个参数为url字符串
// 第二个参数true表示把query属性变成对象形式
// 第三个参数的作用主要用于操作//foo/bar这种格式的字符串,把双斜杠后面的第一个字符串解析为host
// let obj = url.parse(str,true,true);
// console.log(obj);
// console.log(obj.query.key);
// console.log(obj.query.word);

url.format()

let o = {
  protocol: 'http:',
  slashes: true,
  auth: null,
  host: 'www.baidu.com',
  port: null,
  hostname: 'www.baidu.com',
  hash: null,
  search: '?key=123&word=javascript',
  query: 'key=123&word=javascript',
  pathname: '/abc/qqq/ddd',
  path: '/abc/qqq/ddd?key=123&word=javascript',
  href: 'http://www.baidu.com/abc/qqq/ddd?key=123&word=javascript' 
};
// 把对象转换成标准格式的url字符串
let str = url.format(o);
console.log(str);

从服务器角度获取get请求参数

const http = require('http');
const url = require('url');
const sserver = require('./static-server.js');//封装的静态服务器模块

http.createServer((req,res)=>{
    // 启动静态服务器功能
    sserver.initStaticServer(req,res,__dirname,'/www');
    // 判断是否为表达提交url
    if(req.url.startsWith('/check')){
        let obj = url.parse(req.url,true);
        if(obj.query){
            // 设置响应内容格式和编码
            res.writeHead(200,{
                'Content-Type':'text/plain; charset=utf8'
            });
            // 判断用户名和密码是否正确
            if(obj.query.username=='admin'&&obj.query.password=='123'){
                res.end('登录成功');
            }else{
                res.end('用户名或者密码错误');
            }
        }
    }

}).listen(3000,()=>{
    console.log('running...');
});

从服务器角度获取post提交数据

const http = require('http');
const querystring = require('querystring'); //引入querystring模块
const sserver = require('./static-server.js');

http.createServer((req, res) => {
    // 启动静态服务器功能
    sserver.initStaticServer(req, res, __dirname, '/www');
    // 判断是否为表达提交url
    if (req.url.startsWith('/check')) {

        let pdata = '';
        let num = 1;
        // 基于事件的回调函数,回调函数接受到一部分数据就调用一次
        req.on('data', (chunk) => {
            num++; //接收两次num++ 2次
            pdata += chunk;
        });
        // 接受到所有的数据之后才调用end对应的回调函数
        req.on('end',()=>{
            let obj = querystring.parse(pdata);
            // 设置响应内容格式和编码
            res.writeHead(200,{
                'Content-Type':'text/plain; charset=utf8'
            });
            // 判断用户名和密码是否正确
            if(obj.username=='admin'&&obj.password=='123'){
                res.end('登录成功');
            }else{
                res.end('用户名或者密码错误');
            }
        });
    }

}).listen(3000, () => {
    console.log('running...');
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值