Node.js学习第四天笔记

1 项目开发步骤

  1. 生成package.json文件;如npm init --y;
  2. 安装模块文件;如:npm install express --save-dev;
  3. 创建服务器文件:命令:touch server.js,创建server.js文件;

2 express三步走

  1. 引入模块,创建服务器:const app=express()
  2. 添加监听:app.listen(8080)
  3. 添加强求: app.get("/") app.post("/:admin/:id") app.use("/")

3 express整体感知

  1. 强大的路由:
    • 可以用比较严格的路由;如:/admin
    • 可以自己手动给路由写正则表达式:/^\/student\/(\d{6})$/; 取参数:req.params[0];
    • 可以使用express自己提供的路由:"/student/:id";取参数:req.params.id;
  2. 静态资源服务:app.use(express.static("./public"));将所有静态资源放在public的目录下;打开所有的静态文件;
  3. 可以跟模板配合使用,需要两步
    1. 设置模板引擎:app.set("view engine","ejs");常用模板引擎:ejs,jade;
    2. 通过res来渲染模板到浏览器:res.render("index",{n:8});注意:express中默认把模板都放在views目录下;./views/可以省略;index.ejs后缀名也可以省略;

4 get请求

  • 原生node中,如何接收get请求的参数?
    • 用url模块:url.parse(req.url,true).query
  • 在express中,如何接收get请求的参数?
    • 代码:req.query;获取参数对象;
  • ejs代码:
     <!doctype html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>表单get提交</title>
     </head>
     <body>
     <form action="/admin" method="get">
         <label for="user">
             用户名:<input type="text" id="user" name="username" value="guomushan">
         </label><br/>
         <label for="pass">
             密码:<input type="text" id="pass" name="password" value="0525">
         </label><br/>
         <input type="submit" value="提交">
     </form>
     </body>
     </html>
    
  • get请求服务器代码:
     const express=require("express");
     const app=express();
     app.listen(8080);
     
     //设置模板引擎;
     app.set("view engine","ejs");
     //1.地址栏发送get请求,请求地址为/;然后打开form.ejs文件;
     app.get("/",function (req,res) {
         res.render("form");
     });
     //2.在form表单中,action请求地址与get请求地址相同;这样就会进入请求;
     app.get("/admin",function (req,res) {
         console.log(req.query);//{ username: 'guomushan', password: '0525' }
         res.send("提交成功");
     });
    

5 post请求

  • 原生node中,接受post请求的参数:
     var str="";
     req.on("data",function(data){
        str+=data;
      }
     req.on("end",function(){
        var postData=querystring(str);//拿到对象格式的数据;
      }
    
  • express中,如果请求的是普通数据的话,用body-parser这个模块;如果请求的数据包含大文件(音频,视频,图片,word等),用formidable模块;
  • 使用body-parser三部曲:
    1. 引入模块 bodyParser=require("body-parser");
    2. 设置中间件app.use(bodyParser.urlencoded({extended:false}));
    3. 通过req.body拿到前端通过请求体提交过来的数据;
  • 代码:
    • form表单代码:
     <!doctype html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>表单post提交</title>
     </head>
     <body>
     <h2>post提交请求</h2>
     <form action="/admin" method="post">
         <label for="user">
             用户名:<input type="text" id="user" name="username" value="guomushan">
         </label><br/>
         <label for="pass">
             密码:<input type="text" id="pass" name="password" value="0525">
         </label><br/>
         <input type="submit" value="提交">
     </form>
     </body>
     </html>
    
    • post-server服务器代码:
     const express=require("express");
     const bodyParser=require("body-parser");
     const app=express();
     app.listen(8080);
     //设置模板引擎
     app.set("view engine","ejs");
     //1.通过get请求,在页面中渲染表单
     app.get("/",function (req, res) {
         res.render("form-post");
     });
     //设置中间件,使用bodyParser必须设置中间件,否则不能拿到数据;
     app.use(bodyParser.urlencoded({ extended: false }));
     //2.利用post请求,获取参数
     app.post("/admin",function (req, res) {
        console.log(req.body);
        res.send("提交成功");
     });
    

6 use请求

  • use请求可以扩充地址;地址不严格;
  • 格式代码:app.use("/admin",function(req,res){})
  • req.originalUrl:拿到的是:包括基本地址的所有请求地址;
  • req.baseUrl:拿到的是:基本地址/admin",如路由地址相同;
  • req.path:拿到的是:不包括基本地址,也不包括参数的其余地址;
  • req.url:拿到的是:不包括基本地址的所有请求地址;
  • 代码:
 app.use("/admin",function (req, res) {
     //地址栏请求地址:http://localhost:8080/admin/aaa/bbb/index.js?name=guo&age=26
     //1.req.url拿到的是/admin后面的地址;
     console.log(req.url);//打印结果:/aaa/bbb/index.js?name=guo&age=26
     //2.req.originalUrl拿到真正的请求地址和传给后台的参数;
     console.log(req.originalUrl);//打印结果:/admin/aaa/bbb/index.js?name=guo&age=26
     //3.req.baseUrl拿到的是基本的地址,与路由地址一致;
     console.log(req.baseUrl);//打印结果:/admin
     //4.req.path拿到的是除了基本地址的其他子子孙孙的路径地址;(不包含基本地址,也不包含参数)
     console.log(req.path);//打印结果:/aaa/bbb/index.js
     res.send("ok");
 });

7 中间件middleware

  • 路由get,post这些东西;就是中间件,中间件讲究顺序,匹配上第一个之后,就不会往后匹配了;next函数才能够继续往后匹配;所以,get和post对路由卡的很死;
    • 解决方式1:写路由的时候,具体的往上写,抽象的往下写;
     app.get('/admin/login',function (req,res) {
         console.log('2');
         res.send('管理员登录');//send后面不能写任何代码;会报错;
     });
     app.get('/:username/:id',function (req,res,next) {
         console.log('1');
         res.send('管理员登录'+req.params.username)
     });
    
    • 解决方式2:配合数据库,进行条件判断,数据库中存在的进行if条件;不存在进行else,执行next(),进而执行其他的代码;
     const express=require("express");
     const app=express();
     app.listen(8080);
     //简单的数据库
     var user={
         teacher:["guo","bin"],
         student:88
     };
     //先执行上面代码;然后进行条件判断;如果不满足,在向下进行代码;
     app.get("/:username/:pass",function (req, res,next) {
         var username=req.params.username;
         if(user[username]){
             res.send("我是普通用户");
         }else{
             next();
         }
     });
     app.get("/admin/login",function (req, res,next) {
         res.send("我是管理员");
     });
    
  • app.use()也是一个中间件,与get和post不同的是,他的网址不是精确匹配的,而是能够有小文件夹拓展的;如下;
    • 当你不写路径的时候,就相当于'/',即相当于所有网址;
    • 所以,一般用use当接盘侠;
     // GET 'http://www.example.com/admin/new'
     app.use('/admin',function (req,res) {
         console.log(req.originalUrl); //  '/admin/new'
         console.log(req.baseUrl); //  '/admin'
         console.log(req.path);// '/new'
         res.send('你好')
     });
    

8 send

  • send跟原生node中end的区别:
    • send里面既可以传字符串和buffer;也可以传json对象;
    • 原生node中end和write里面只能传字符串和buffer;
  • send跟render的区别:
    • send一般用来测试;render一般用来渲染页面;
    • send可以用来配合状态码的输出:res.status(404).send("文件没找到");其中状态码发送到前端浏览器中在控制台中呈现;

9 设置浏览器中文件的渲染类型

  • 原生node中通过:res.writeHeader(200,{"Content-Type":"text/html;charset=UTF-8"})
  • 在express中通过:res.set("Content-Type","text/html");

链接文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容