首页 文章 精选 留言 我的

精选列表

搜索[node],共10006篇文章
优秀的个人博客,低调大师

node09---中间件

如果我的的get、post回调函数中,没有next参数,那么就匹配上第一个路由,就不会往下匹配了。 如果想往下匹配的话,那么需要写next() 1app.get("/",function(req,res,next){ 2 console.log("1"); 3 next(); 4}); 5 6app.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}); 5 6app.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}); 5 6app.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}); 11 12app.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/dd 1app.use("/admin",function(req,res){ 2 res.write(req.originalUrl + "\n"); // /admin/aa/bb/cc/dd 3 res.write(req.baseUrl + "\n"); // /admin 4 res.write(req.path + "\n"); // /aa/bb/cc/dd 5 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/dd app.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参数,如果有,那么就这个函数能捕获err app.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); 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7039939.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册