Node.js学习第二天笔记

1 发送请求的方式

1.1 post请求

  • post请求的数据在请求体中,不在地址栏中,可以传输大数据
    • 请求的数据为字符串类型,即query类型;如key1=v1&key2=v2&key3=v3
  • get请求的数据是通过地址栏,传递参数,只能传输小数据,
    • 请求的数据:通过req.url拿到的是端口号后面的部分;如/index.html?key1=v1&key2=v2&key3=v3;
    • 通过url模块,拿到URL对象,取对象中query属性;
  • post请求的大数据在请求时,会被拆分为多个小块数据,发送多次请求;
  • 需要利用on绑定事件;
    • 接收请求:绑定"data"事件;如:req.on("data",(data)=>{});通过字符串拼接拿到多次传输的完整数据;
    • 响应:绑定"end"事件;如:req.on("end",()=>{});
  • 代码:
     const http=require("http");
     const querystring=require("querystring");
     const url=require("url");
     const server=http.createServer((req,res)=>{
         if(req.url==="/favicon.ico") return;
         //post请求
         //就相当于把接收的大块数据拆分成的多个小块数据;
         //data事件,会执行很多次;
         var str="";
         req.on("data",(data)=>{
             str+=data;
         });
         //end事件只会触发一次;在数据被运输完成的时候;
         req.on("end",()=>{
             var postData=querystring.parse(str);
             console.log(postData);//打印的是对象;
             res.end("ok");//结束浏览器的响应;
         });
     });
     server.listen(8080);
    

1.2 get请求和post请求的共存

  • 服务器中get请求和post请求是共同存在的;
  • 在服务器中get请求的代码要放在end事件中;因end事件只会触发一次;在数据被运输完成的时候;
  • 代码:
     const http=require("http");
     const querystring=require("querystring");
     const url=require("url");
     const server=http.createServer((req,res)=>{
         if(req.url==="/favicon.ico") return;
         //post请求
         //就相当于把接收的大块数据拆分成的多个小块数据;
         //data事件,会执行很多次;
         var str="";
         req.on("data",(data)=>{
             str+=data;
         });
         //end事件只会触发一次;在数据被运输完成的时候;
         req.on("end",()=>{
             var postData=querystring.parse(str);
             //get请求和post请求同时存在的时候,要将get请求的代码写在end中;
             var getData=url.parse(req.url,true).query;
             console.log(postData);//打印的是对象;
             console.log(getData);//打印的是对象;
             res.end("ok");//结束浏览器的响应;
         });
     });
     server.listen(8080);
    

2 注册登录验证实例

  • 思路:
    • 登录注册页面的加载:通过地址栏中发送get请求,必须设置地址中的pathname为html文件名,且在服务器中通过拿到pathname值,然后通过fs.readFile()来打开相对路径下的html文件,然后通过res.end(data),将数据渲染会前端页面,即html文件加载呈现;
    • 通过给登录和注册按钮添加点击事件,来分别进行ajax发送请求;
    • 通过获取地址中的pathname,来获取ajax中设置的url为/user,在服务器中进行筛选,进而判断用户名和密码的对应,来进行不同的判断;因为已经在同一域名下,所以只需要设置pathname值即可;
    • ajax中success函数中,获取的data数据为服务器中end传出的数据,传出数据为json格式的字符串,在ajax中通过获取数据类型为json格式,来将响应的数据转化为json格式的对象;
  • 知识点及问题:
    • 在使用jquery中的ajax发送请求时;需要通过script引入jquery,在渲染页面后,src会默认再发送一次get请求,请求的pathname为引入的相对路径,也通过fs.readFile()来渲染打开,此时页面才能引入jquery插件,才能使用;否则,不能使用;
  • 代码:
    • html代码:
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>登录注册实例</title>
     </head>
     <body>
     <form>
         <label for="user">
             用户名:<input id="user" type="text" name="user">
         </label>
         <label for="pass">
             密码:<input id="pass" type="password" name="pass">
         </label>
         <input type="button" value="注册" id="reg">
         <input type="button" value="登录" id="login">
     </form>
     <script src="ajax.js"></script>
     <script>
         var oUser=document.getElementById("user");
         var oPass=document.getElementById("pass");
         var oReg=document.getElementById("reg");
         var oLogin=document.getElementById("login");
         oLogin.onclick=function () {
             myAjax({
                 url:"/user",
                 type:"get",
                 dataType:"json",
                 data:{act:"login",username:oUser.value,password:oPass.value},
                 success:function (data) {
                     alert(data.msg);
                 },
                 error:function () {
                     console.log("通讯错误");
                 }
             })
         };
         oReg.onclick=function () {
             myAjax({
                 url:"/user",
                 type:"get",
                 dataType:"json",
                 data:{act:"reg",username:oUser.value,password:oPass.value},
                 success:function (data) {
                     alert(data.msg);
                 },
                 error:function () {
                     console.log("通讯错误");
                 }
             })
         };
     </script>
     </body>
     </html>
    
    • 服务器js代码:
     const http=require("http");
     const fs=require("fs");
     const url=require("url");
     var user={
         guo:"123",
         bin:"456"
     };
     const server=http.createServer((req,res)=>{
         if(req.url==="/favicon.ico") return;
         var getData=url.parse(req.url,true);
         var pathname=getData.pathname;
         var queryData=getData.query;
         var path="./static"+pathname;
         if(pathname==="/user"){
             switch(queryData.act){
                 case "login":
                     if(user[queryData.username]){
                         if(user[queryData.username]===queryData.password){
                             res.end('{"bok":true,"msg":"欢迎你 '+queryData.username+'!!!"}')
                         }else{
                             res.end('{"bok":false,"msg":"密码不正确!!!"}')
                         }
                     }else{//证明该用户不存在
                         //返回页面的内容为JSON格式的字符串
                         res.end('{"bok":false,"msg":"该用户不存在,请注册!!!"}')
                     }
                     break;
                 case "reg":
                     if(user[queryData.username]){
                         res.end('{"bok":false,"msg":"该用户已注册!!!"}')
                     }else{
                         user[queryData.username]=queryData.password;
                         console.log(user);
                         res.end('{"bok":true,"msg":"注册成功,请登录!!!"}')
                     }
                     break;
                 default:
                     res.end('{"bok":false,"msg":"未知的act"}')
             }
         }
         //打开路径下的文件fs.readFile
         fs.readFile(path,(err,data)=>{
             if(err){
                res.end("4044");
             }
             res.end(data);
         });
     });
     server.listen(1234);
    

3 node模块

  • 模块可以分为三大类
    • nodejs自带的模块:http,fs,event,path,querystring,url等;
    • 引入第三方模块;nodejs天生自带一个包管理器npm
    • 自定义模块;
      • 每一个JS都是一个独立的模块;
      • 通过require引入模块,可省略.js后缀;
      • 自定义模块移入JS文件可省略JS后缀,不能省略相对路径;在同一个文件夹下也不能省略./相对路径;省略之后就会出错;
      • 如果省略相对路径后,会默认先在系统中查找,如果找不到,再到node_modules文件夹中查找,所以,如果不写相对路径,也可以将需引入的文件放入到node_modules文件夹中,但是,为防止混乱,不建议用此方法;
      • 在JS文件中引入JS模块后,获得的是一个对象;在被引入的模块中通过exports输出对象的属性;可通过module.exports={}来输出一个对象;定义多个属性;
      • 代码:
        • 被引入模块aa.js文件代码:
         var a=1234;
         //1.通过exports来分别导出属性名;
         /*exports.a=a;//通过exports来定义对象中的属性名和属性值;
         exports.b="haha";
         exports.c="xixi";*/
         //2.通过module来输出多个;
         module.exports={
             a,//es6对象中当属性名和属性值相同的时候,可省略属性值;
             b:"haha",
             c:"xixi"
         };
        
        • 获取引入模块bb.js文件代码:
         var obj=require("./01aa");//导入的js文件为一个对象;
         console.log(obj);//输出结果为一个对象;即:{ a: 1234, b: 'haha', c: 'xixi' }
         console.log(obj.a);//输出属性值为1234;
         console.log(obj.b);//输出属性值为haha;
         console.log(obj.c);//输出属性值为xixi;
        
  • node_modules文件
    • 每一个模块中都存在一个package.json文件,文件中储存多个信息;
      • dependencies:上线依赖的模块
      • devdependencies:开发过程中依赖的模块;
      • main:指的是默认引入的文件路径;
  • 项目开发步骤:
    • git init:文件夹初始化;
    • npm init:项目初始化;按照顺序填写参数;会生成一个package.json文件;也可以通过npm init --y快速设置当前项目初始化;所有参数均为默认参数;
    • ls/dir:查看当前文件夹中的文件;
    • 安装第三方模块
      • 安装到全局:npm install xxx -g(global),可简写为npm i xxx -g;
      • --save指的是在当前目录安装,会在dependencies中会出现安装的文件;指的是在上线时的依赖;如:npm install jquery --save;
      • --save-dev:指的是在当前目录下安装,但会在devdependencies中展现;即在开发过程中的依赖;如:npm install bootstrap --save-dev;
      • 卸载:npm uninstall xxx;
  • 项目名称不能写express名称;
  • 一般情况下,一个项目都需要用package.json文件,这个文件可以提供当前项目依赖的模块;如果把你的项目给别人的时候,不需要传输node_modules;当他拿到你的文件后,在控制台输入npm install就会自动的按照项目中package.json文件中的dependencies文件中的依赖,下载对应的模块,项目才会正常运行;
  • 简书总结链接node学习大纲
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容