博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node09---中间件
阅读量:5120 次
发布时间:2019-06-13

本文共 4700 字,大约阅读时间需要 15 分钟。

如果我的的get、post回调函数中,没有next参数,那么就匹配上第一个路由,就不会往下匹配了。如果想往下匹配的话,那么需要写next()1app.get("/",function(req,res,next){2    console.log("1");3    next();4});56app.get("/",function(req,res){7    console.log("2");8});下面两个路由,感觉没有关系:1app.get("/:username/:id",function(req,res){2    console.log("1");3    res.send("用户信息" + req.params.username);4});56app.get("/admin/login",function(req,res){7    console.log("2");8    res.send("管理员登录");9});但是实际上冲突了,因为admin可以当做用户名 login可以当做id。解决方法1:交换位置。 也就是说,express中所有的路由(中间件)的顺序至关重要。匹配上第一个,就不会往下匹配了。 具体的往上写,抽象的往下写。1app.get("/admin/login",function(req,res){2    console.log("2");3    res.send("管理员登录");4});56app.get("/:username/:id",function(req,res){7    console.log("1");8    res.send("用户信息" + req.params.username);9});报错,因为send了两次。解决方法2: 1app.get("/:username/:id",function(req,res,next){2    var username = req.params.username;3    //检索数据库,如果username不存在,那么next()4    if(检索数据库){5        console.log("1");6        res.send("用户信息");7    }else{8        next();9    }10});1112app.get("/admin/login",function(req,res){13    console.log("2");14    res.send("管理员登录");15});路由get、post这些东西,就是中间件,中间件讲究顺序,匹配上第一个之后,就不会往后匹配了。next函数才能够继续往后匹配。--------------------------------------------------------------------------------app.use()也是一个中间件。与get、post不同的是,他的网址不是精确匹配的。而是能够有小文件夹拓展的。比如网址:  http://127.0.0.1:3000/admin/aa/bb/cc/dd1app.use("/admin",function(req,res){ 2    res.write(req.originalUrl + "\n");   //    /admin/aa/bb/cc/dd3    res.write(req.baseUrl + "\n");  //   /admin4    res.write(req.path + "\n");   //    /aa/bb/cc/dd5    res.end("你好");6});如果写一个/1//当你不写路径的时候,实际上就相当于"/",就是所有网址2app.use(function(req,res,next){3    console.log(new Date());4    next();5});app.use()就给了我们增加一些特定功能的便利场所。实际上app.use()的东西,基本上都从第三方能得到。● 大多数情况下,渲染内容用res.render(),将会根据views中的模板文件进行渲染。如果不想使用views文件夹,想自己设置文件夹名字,那么app.set("views","aaaa");● 如果想写一个快速测试页,当然可以使用res.send()。这个函数将根据内容,自动帮我们设置了Content-Type头部和200状态码。send()只能用一次,和end一样。和end不一样在哪里?能够自动设置MIME类型。● 如果想使用不同的状态码,可以:    res.status(404).send('Sorry, we cannot find that!');● 如果想使用不同的Content-Type,可以:    res.set('Content-Type', 'text/html');

06.js

/** * Created by Danny on 2015/9/22 10:47. */var http = require("http");// 这个语句,就在打开服务器的时候,执行一次。// 每次用户访问的时候,不执行这个语句var a = 100;var server = http.createServer(function(req,res){    // 用户访问的时候,执行这里的语句:    a++;    res.end(a.toString());});server.listen(3000,"127.0.0.1");

07.js

/** * Created by Danny on 2015/9/22 10:22. */var express = require("express");var app = express();var a = 100;//路由从上往下找,找到就不向下找了,app.get("/:username/:id",function(req,res,next){    var username = req.params.username;    //检索数据库,如果username不存在,那么next()    if(检索数据库){        console.log("1");        res.send("用户信息");    }else{        next();//继续向下找匹配的路由    }});app.get("/admin/login",function(req,res){    console.log("2");    res.send("管理员登录");});app.listen(3000);

08.js

/** * Created by Danny on 2015/9/22 10:22. */var express = require("express");var app = express();//当你不写路径的时候,实际上就相当于"/",就是所有网址app.use(function(req,res,next){    console.log(new Date());    next();});//http://localhost:3000/haha/ssss是匹配不了的app.get("/haha",function(req,res){    console.log("哈哈");});//http://127.0.0.1:3000/admin/aa/bb/cc/ddapp.use("/admin",function(req,res){    res.write(req.originalUrl + "\n");//    /admin/aa/bb/cc/dd    res.write(req.baseUrl + "\n");//   /admin    res.write(req.path + "\n");    res.end("你好");});app.listen(3000);

09.js

/** * Created by Danny on 2015/9/22 10:22. */var express = require("express");var fs = require("fs");var app = express();//当你不写路径的时候,实际上就相当于"/",就是所有网址app.use(haha);app.get("/admin",function(req,res){    res.send("管理员");})app.listen(3000);function haha(req,res,next){    var filePath = req.originalUrl;    //根据当前的网址,读取public文件夹中的文件    //如果有这个文件,那么渲染这个文件    //如果没有这个文件,那么next();    fs.readFile("./public/" + filePath,function(err,data){        if(err){            //文件不存在            next();            return;        }        res.send(data.toString());    });}

10.js

/** * Created by Danny on 2015/9/22 10:22. */var express = require("express");var app = express();//静态服务,一般静态资源往上写。不执行next();app.use("/jingtai",express.static("./public"));//新的路由app.get("/images",function(req,res){    res.send("哈哈");});//会自动识别err参数,如果有,那么就这个函数能捕获errapp.use(function(req,res){    res.status(404).send("没有这个页面!");});app.listen(3000);

11.js

/** * Created by Danny on 2015/9/22 10:22. */var express = require("express");var app = express();app.set("views","aaaa");//如果不想使用views文件夹,想自己设置文件夹名字,app.set("view engine","ejs");app.get("/",function(req,res){    res.render("haha",{news:[]});});app.get("/check",function(req,res){    res.send({        "user" : "ok"    });});app.listen(3000);

 

转载于:https://www.cnblogs.com/yaowen/p/7039939.html

你可能感兴趣的文章
windows线程用户模式-关键段
查看>>
xslt 简单的语法
查看>>
UVA10878 Decode the tape
查看>>
Java Thread
查看>>
jquery新增元素on click无效
查看>>
个人每日总结10
查看>>
【转】Jmeter在命令行运行技巧
查看>>
行测(爆发篇)之数学运算怎能轻言放弃?!
查看>>
socket 编程入门教程(三)TCP原理:4、设计TCP socket的类(下)
查看>>
最简洁的IP判断正则表达式
查看>>
第2次作业:微博软件分析
查看>>
Python__slots__详解
查看>>
在 win 10 中使用sql 2012 附加低版本数据失败的解决办法。
查看>>
Algorithmic Graph Drawing in TikZ
查看>>
SQL2000数据库密码被替换,重置密码提示未能找到存储过程sp_password解决方案
查看>>
王之泰201771010131《面向对象程序设计(java)》第二周学习总结
查看>>
C++入门经典-例6.2-将二维数组进行行列对换
查看>>
video相关参数、操作和事件
查看>>
SharePoint 2010 PowerShell 系列 之 应用总结
查看>>
zepto的scrollTo,实现锚点跳转
查看>>