Node内置模块的使用及服务器的搭建

一、什么是Node.Js

node.js是服务器语言,后台语言,使用的是ECMScript的语法

特点:

  1. 对于前端非常友好,学习成本低
  2. node的服务器比PHP的服务器更快,速度提升了86倍
  3. 单线程异步执行,事件处理机制
  4. node.js的源码是由c语言构成,采取了ECMAScript的语法进行编程,运行在V8引擎中

二、Node.Js的安装

  1. 官网下载安装(入门推荐):

      (https://nodejs.org/zh-cn/download/)
    
  2. 安装完node的标志是在命令提示符中输入
    node -v可以查看当前node的版本号
    npm -v可以查 看当前npm的版本号

  3. 包管理工具安装:
    nrm是一种资源包的来源管理工具,主要用来修改npm包的来源方,使用之前先安装,方式为:npm install nrm -g,参考地址:
    https://www.jianshu.com/p/e18c4c30b2c5

三、Node.Js的内置模块

  1. http模块:用来开启服务
  //1.引入模块
      const http = require("http”);

      //2.开启一个http服务,接收的回调函数中,有两个返回值,req表示请求(客户端到服务端),res表示响应(服务端到客户端)
       const httpObj = http.createServer((req,res)=>{})
       //创建服务成功后,每次请求都会触发createServer的回调函数
      const httpObj = http.createServer((req,res)=>{
              //http请求默认情况下,会多请求一次favicon.ico图标文件,如不需要可以过滤
              if(req.url != "/favicon.ico"){
                    //可以在服务端打印信息,只要被访问就会触发
                     console.log("有人访问了");
                     //参数req有属性为url,表示当前服务被哪个url访问,打印访问服务的url
                     console.log("访问的地址是:" + req.url);
                     //如果需要向前端返回数据,而且数据需要以html的形式被解析,有两种方式:
                 //      1.通过head和meta标签设置字符编码
                     //res.write("<head><meta charset='utf-8'></head>");
                     //      2.通过设置请求头,设置字符编码(推荐)
                     res.writeHead(200,{"content-type":"text/html;charset=utf-8"})
                     //通过参数res的write方法,向前端返回数据,此处打印标签进行测试
                     res.write("<mark>晚上吃什么</mark>")
                     //完成此次请求的响应之后,要结束本次响应,否则前端会一直处在请求状态
                     res.end()
              }
       })

      //3.监听端口地址,成功开启服务,执行回调函数...
       httpObj.listen("8001","127.0.0.1",()=>{
              console.log("server runing...");
      });

  1. fs模块:用来操作模块
      //引入fs(文件系统)模块
      const fs = require('fs’);
      
      //调用fs模块的读取文件方法,接收三个参数:
            //参数1:指定读取文件名为请求的文件名
            //参数2:指定解析文件内容的编码格式,可省略
            //参数3:回调函数,读取文件后执行,接收两个参数
           			 //参数1:错误日志,或,null
            		//参数2:文件内容
      fs.readFile( "./www/index.html","utf-8",(err,fsCont)=>{
            if (err){
                  //如果不为null,表示有错误内容,响应404
                  res.write( "404")
            } else{
                  //如果为null,表示找到文件,将文件作为数据响应
                  res.write( fsCont)
            }
            res.end(); //结束本次请求
      })
  1. url模块:用来解析url
	const urlModel = require("url")

      //模拟一个url
      var url = "http://www.baidu.com/data/hahaha/?a=1&b=2#01";
      console.log( typeof url);
      console.log(url);

      //将url解析成对象
      var obj = urlModel.parse(url);
      var obj = urlModel.parse(url,true); //将url中的query属性解析成对象
      console.log( typeof obj);
      console.log(obj);

      //将对象解析成url
      var str = urlModel.format(obj)
      console.log( typeof str);
      console.log(str);
  1. querystring模块:用来解析url携带的数据
	  //将查询字符与对象互相转换的模块
      const querystring = require("querystring");

      //模拟类似于get方式发送的信息
      var str = 'name=admin%padd=123';
      //根据%号,分割字符为对象
      var obj = querystring.parse(str,"%");
      console.log( typeof obj);
      console.log(obj);

      //模拟对象
      var obj2 = {a:1,b:2}
      console.log(obj2)
      //将对象转换成类似于get方式发送的信息,用%号隔开
      var str2 = querystring.stringify(obj2,"%");
      console.log( typeof str2)
      console.log(str2)

四、Node.Js搭建一个登陆注册服务器

const http = require("http");
const fs = require("fs");
const url = require("url");
const qs = require("querystring");

http.createServer((req, res)=>{
    if(req.url !== "/favicon.ico"){
        if(url.parse(req.url).pathname === "/api"){
            ajaxHandle(req, res);
        }else{
            fileHandle(req, res);
        }
    }
}).listen("3000");

function ajaxHandle(req, res){
    // 地址上的数据,直接解析,同步
    const urlObj = url.parse(req.url, true);

    // 非地址上的数据,通过事件接收,异步
    let str = "";
    req.on("data",d=>{
        str += d;
    })
    req.on("end",()=>{
        let reqObj = null;
        if(str === ""){
            reqObj = urlObj.query;
        }else{
            reqObj = qs.parse(str);
        }
        if(reqObj.type === "login"){
            // 登录功能
            login(reqObj, res)
        }else{
            // 注册功能
            register(reqObj, res)
        }
    })
}

let userMsg = [];

function register(data, res){
    // 利用some方法判断用户数据中是否已经存在当前注册的用户名
    let onoff = userMsg.some(val=>{
        return val.user === data.un
    })
    
    if(onoff){
        // 如果存在,用户名重复
        res.write(JSON.stringify({code:0,title:"用户名重复"}))
    }else{
        userMsg.push({
            userid:"userid_"+Math.random().toString().slice(2),
            user:data.un,
            pass:data.pw,
            flag:0
        })
        // 不存在,注册成功
        res.write(JSON.stringify({code:1,title:"注册成功"}))
    }
    console.log(userMsg);
    res.end();
}

function login(data, res){
    // 此案判断用户数据中是否具有传入的用户名
    console.log(data);
    let i = 0;
    let onoff = userMsg.some((val, idx)=>{
        i = idx;
        return val.user === data.un;
    })
    if(onoff){
        // 如果有,判断当前数据是否和传入的密码相等
        if(userMsg[i].pass === data.pw){
            // 相等,登录成功
            res.write(JSON.stringify({code:1,title:"登录成功",data:userMsg[i]}))
            // 修改当前数据的状态
            userMsg[i].flag = 1;
        }else{
            // 不相等,密码错误
            res.write(JSON.stringify({code:2,title:"密码错误"}))
        }
    }else{
        // 没有用户名,未注册
        res.write(JSON.stringify({code:0,title:"用户名不存在"}))
    }
    res.end();
}

function fileHandle(req, res){
    fs.readFile("./www" + url.parse(req.url).pathname,(err, data)=>{
        if(err){
            res.write("404");
        }else{
            res.write(data);
        }
        res.end();
    })
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值