node.js路由控制

  一、工作原理

当通过浏览器访问app.js建立的服务器时,会看到一个简单的页面,实际上它已经完成了许多透明的工作,
当访问http://localhost:3000,浏览器会向服务器发送请求,包括请求的方法、路径、HTTP协议版本和请求头信息。app会解析请求的路径,调用相应的逻辑,app.js中有app.get("/",routes.index)通过res.render("index",{title:"pcat"})调用视图模版index,传递title变量,最终视图生成HTML页面,返回给浏览器。
浏览器接收到内容后,通过分析需要获取/stylesheets/style.css,因此会再次向服务器发起请求,app.js并没有一个路由规则指派到/stylessheets/style.css,但app通过app.use(express.static(__dirname+'/public'))配置了静态文件服务器,因此会定向到app.js所在目录下的/public/stylessheets/style.css拿去这个文件。
这是一个典型的MVC架构,浏览器发送请求,由路由控制接受,根据不同的路径定向到不同的服务器,控制器处理用户具体的请求,可能会访问数据库中的对象,即模型部分,生成视图的HTML,最后再由控制器返回给浏览器,完成一次请求。

二、创建路由规则

当我们在浏览器访问http://localhost:3000/pcat的时候,服务器响应头返回404 Not found错误
这是因为/pcat是一个不存在的路由规则,而且它也不是一个public目录下的文件,所以响应404
假设我们创建一个/pcat的的路由规则。
app.get("/pcat",routes.pcat)。在index.js中增加函数pcat
exports.pcat=function(req,res){
res.send('The time is '+new Date().toString());
}
服务器在开始监听之前,设置好了所有的路由规则,当请求到达时直接分配到相应函数。app.get是路由规则创建函数,
参数一:请求的路径
参数二:是一个回调函数,该路由规则被触发时调用回调函数,并传递req(请求信息)和res(响应信息)两个参数。

三、路径匹配

上面讲到了为固定的路径设置路由规则,Express还提供更高级的路径匹配模式。
1.app.get('/user/:username',function(req,res){
res.send("user :"+req.params.username);
});
路径规则/user/:username会被自动编译成正则表达式,类似于\/user\/([^\/]+)\/?这样的形式,路径参数可以相应函数中通过req.params的属性访问
2.路径规则同样支持javascript正则表达式,例如:app.get(\/user\/([^\/]+)\/?,callback),这样的好处在于可以定义更加复杂的路径规则,不同支持是配置的参数是匿名的,因此需要通过req.params[0]这样的形式访问。

四、REST风格的路由规则

Express支持REST风格的请求方式,REST意思是表征状态转移,它是一种基于HTTP协议的网络应用的接口风格,充分利用HTTP的方法实现了统一风格的接口和服务,HTTP协议定义了一下8个标准方法:
         GET:请求获取指定的资源       获取
        POST:向指定资源提交数据       新增
        DELETE:请求服务器删除指定资源     删除
         PUT:请求服务器存储一个资源              更新      
HEAD:请求指定资源的响应头
TRACE:回显服务器数到的请求,主要用户测试或诊断
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS:返回服务器支持的HTTP请求方法
所谓安全指的是连续访问多次所获得的结果不受访问者的影响。而幂等指的是重复请求多次与一次请求的效果是一样的,比如获取、更新和删除操作是幂等,这与新增不同。
Express对每种HTTP请求方法都设计了不同的路由绑定函数,例如前面全部是app.get,标识该路径绑定了GET请求,向这个路径发起其他方式的请求不会被响应。
GET     app.get(path,callback)
POST     app.post(path,callback)
PUT     app.put(path,callback)
DELETE     app.delete(path,callback)
...
...
    所有方法   app.all(path,callback,next)
怎么使用?
绑定一个POST请求,可以使用app.post(path,callback)的方法设置路由规则。
app.all函数,它支持把所有的请求方法都绑定到同一个相应函数,是一个非常灵活的函数。

五、控制权转移

Express支持同一路径绑定多个相应函数
app.all('/test/:user',function(req,res,next){
//我们在这里验证用户名是否存在。
//如果存在直接send或者调用next(new Error('用户已经存在'));
//如果不存在我们调用next()把控制权交给下一个路由规则
console.log("all methods is call");
next();
res.send('哈哈');
});
app.get('/test/:user',function(req,res){
res.send("user:"+req.pararms.user)
})
但是我们访问都会只返回一次。
Exress提供了路由控制权转移的方法,即next()函数,通过调用则将控制权交给后面的规则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C、C++和MFC中文件的操作

对文件读写的三种方法1.C中FILE *pFilefopen("1.txt","w");fwrite(" http://www.sunxin.org",1,strlen("http://www.sunxin.org"),pFile ");//fseek(pFile,0,SEEK_SET);//fwrite("ftp:",1,strlen("ftp:"),pF…

spark 提交至yarn异常超时 Client cannot authenticate via:[TOKEN, KERBEROS]

spark-cluster提交任务,提示 exit code :10 异常,具体需要到容器日志中去查看 19/08/07 18:09:24 INFO yarn.Client: client token: N/Adiagnostics: Application application_1565171057576_0008 failed 2 times due to AM Container for appattempt_…

node.js模块引擎

一、什么是模版引擎 模版引擎是一个从页面模版根据一定的规则生成HTML的工具,PHP首发,随后出现了ASP、JSP都沿用这个模式,即建立一个HTML页面模版,插入可执行的代码。运行时动态生成HTML。缺点: 页面功能逻辑与页面布局…

勤学如春起之苗,不见其增,日有所长!

“工作三年,并不等于拥有三年的工作经验。”这句话告诉我们每天都要思考自己当天所遇到的问题,记录下来,并且思考这个问题的解决办法,每一周或两周总结这些问题和解决办法,归纳思考问题根源,学习解决问题的…

HBase ACL管理 Hbase 权限管理

场景:hadoop集群已经进行kerberos认证 启动Hbase相关配置Hbase权限分为以下五种:Read(R) : 可以读取给定范围内数据的权限 Write(W) : 可以在给定范围内写数据 Executor(X) : 可以在指定表执行Endpoints类型的协处理 Create(C) : 可以在给定范围内创建和…

node.js ejs的视图模块引擎

一、版本升级 Express从2.0升级到3.0,将ejs的用法忽略,改为用户自定义形式。引入ejs/index.js的模块,来支持ejs的模版引擎二、引入引擎的模块,然后在app中调用engine函数改造ejs引擎 app.engine(ejs, engine);将layout.ejs设置成默认的布局模…

文本文件和二进制文件的区别

广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。文本文件是一种由很多行字符构成的计算机文件。文本文件存在于计算机系统中,通常在文本文件最后一行放置文件结束标志。文本文件的编码基…

Kerberos Hbase Api 操作

初始化连接加载配置参数,这里只创建连接,具体操作hbase的api没有变化 static { try{ Configuration conf HBaseConfiguration.create();conf.addResource(new Path("config/hbase-site.xml"));//读取配置文件conf.set("hadoop.securi…

ndoe.js实战之开发微博第一讲之工具准备

内容:搭建开发环境和视图制作。一、创建项目 1.express ejs blog 创建项目cd blog 进入项目npm install 加入包的依赖2.加入ejs视图模版引擎支持加入文件 expand_modules/ejs/index.jsvar enginerequire("./expand_modules/ejs");在app中改造引擎app.e…

MySql索引的原理

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B树。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用&#xff08…

SparkStreaming 异常:java.lang.NoSuchMethodError: scala.Predef scope()Lscala/xml/TopScope

SparkStreaming运行报错 19/05/05 22:35:18 INFO SparkEnv: Registering OutputCommitCoordinator Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.$scope()Lscala/xml/TopScope$;at org.apache.spark.ui.jobs.AllJobsPage.<init>(…

node.js微博案例第二讲

一、mongodb数据库安装 1.安装包下载&#xff1a;http://www.mongodb.org/downloads2.开始安装解压放入D:\Program Files\目录下。(推荐文件名为mongodb)创建Data、log和Data/db文件夹将mongodb的数据库文件D:\Program Files\mongodb\data\db目录下执行命令&#xff1a…

Spark提交 指定 kerberos 认证信息

spark-submit --principal hdfs/hostnamejast.COM --keytab hdfs-hostname.keytab --jars $(echo lib/*.jar | tr ,) --class com.jast.test.Test test.jar

mongodb数据库常用指令

详细安装看我文章http://blog.csdn.net/dreamzuora/article/details/78877898打开在bin目录下mongo.exe来操作数据库常用命令&#xff1a;show dbs //查看所有库use blog 使用指定的库show collections 查看所有的文档db.表名.find() 查询指定文档的数据db.表名.insert({…

二叉树遍历解析

1 / \ 2 3 / \ / \ 4 5 6 7 当你拿到一棵二叉树&#xff0c;无论它的形状如何的千奇百怪 我们都可以将它按照如下的方式划分根/ \ 左子树 右子树 一棵有很多个节点的二叉树可以划分为以上的形式 也可以这么…

Hadoop Kerberos 认证下 Sentry 安装 + Sentry 权限设置使用

目录 一、安装Sentry &#xff11;.&#xff2d;ariaDB中创建sentry数据库 2.CDH中添加sentry 服务 3.hive配置 启动Sentry 4.Impala配置 启动Sentry 5.Hue配置 启动Sentry 6.Hdfs配置 启动Sentry 7.重启服务&#xff0c;使配置生效 二、Sentry权限测试 1.创建hive超…

数据结构与算法的联系

首先,数据结构是一门计算机语言学的基础学科&#xff0c;它不属于任何一门语言&#xff0c;其体现的是几乎所有标准语言的算法的思想。 上面的概念有一些模糊&#xff0c;我们现在来具体说一说&#xff0c;相信你门的数据结构使用的是一门具体的语言比如C/C语言来说明&#xff…

mongodb最详细的安装与配置

今天晚上才装好&#xff0c;我觉得有必要写这篇文章给你们分享一下 我是看点击打开链接这位博主的文章才装好的其中我想引用里面内容从头到尾来给你们 分享一下流程 第一步&#xff1a;下载mongodb https://www.mongodb.com/download-center#community 第二步&#xff1a;m…

Impala-shell 启动异常 - Python版本为3.x 启动脚本为2.x

启动 Impala-shell 报错如下 [rootxxx ~]# impala-shellFile "/opt/cloudera/parcels/CDH-5.13.0-1.cdh5.13.0.p0.29/bin/../lib/impala-shell/impala_shell.py", line 222print \tNo options available.^ SyntaxError: Missing parentheses in call to print发现语…

C++面试题(八)

客观题 (1)大端、小端问题&#xff0c;以共用体示例代码给出 假设计算机的CPU是Intel 32位的&#xff0c;以下代码输出结果是什么&#xff1f; [cpp] view plaincopy #include<stdio.h> union ut { short s; char ch[2]; }u; int main() { …