2019年12月19日14:16:36

1. express简介

1.1 介绍

Express框架是后台的Node框架,所以和jQuery、zepto、yui、bootstrap都不一个东西。

Express在后台的受欢迎的程度,和jQuery一样,就是企业的事实上的标准。

原生Node开发,会发现有很多问题。比如:

■ 呈递静态页面很不方便,需要处理每个HTTP请求,还要考虑304问题

■ 路由处理代码不直观清晰,需要写很多正则表达式和字符串函数

■ 不能集中精力写业务,要考虑很多其他的东西

英语官网:http://expressjs.com/

中文官网:http://www.expressjs.com.cn/

安装Express框架,就是使用npm的命令。

--save参数,表示自动修改package.json文件,自动添加依赖项。

1.2 中间件的概念

浏览器向服务器发送一个请求后,服务器直接通过request.定位属性的方式得到通过request携带过去的数据(有用户输入的数据和浏览器本身的数据信息)。这中间就一定有一个函数将这些数据分类做了处理,已经处理好了,最后让request对象调用使用,对的,这个处理数据处理函数就是我们要说的 中间件 。由此可见,中间件可以总结以下几点:

1、封装了一些处理一个完整事件的功能函数。

2、非内置的中间件需要通过安装后,require到文件就可以运行。

3、封装了一些或许复杂但肯定是通用的功能。

1.2.1 app.use()

app.use([path],function)

path:是路由的url,默认参数‘/',意义是路由到这个路径时使用这个中间件

function:中间件函数

这个中间件函数可以理解为就是function(request,response,next)

1.2.2 内置中间件

express.static `是Express目前唯一内置的一个中间件。用来处理静态资源文件。

app.use(express.static(__dirname + '/public'));

启动服务: node index.js

浏览器中访问: http://localhost:1234/ 展示的/public/index.html内容

浏览器中访问: http://localhost:1234/hello.html 展示的/public/hello.html内容

1.2.3 如何自定义中间件

在上面中间件结构中,我们知道了,中间件使用时的第二个参数是一个Function,然而,要自定义一个中间件,就是倒腾一番这个Function。

这个function总共有三个参数(req,res,next)

当每个请求到达服务器时,nodejs会为请求创建一个请求对象(request),该请求对象包含客户端提交上来的数据。同时也会创建一个响应对象(response),响应对象主要负责将服务器的数据响应到客户端。而最后一个参数next是一个方法,因为一个应用中可以使用多个中间件,而要想运行下一个中间件,那么上一个中间件必须运行next()。

1.2.4 第三方中间件

有关第三方中间件,这里我们分析几个比较重要和常用的,知道这几个的使用,其它的也就会了。

body-parser :解析body中的数据,并将其保存为Request对象的body属性。

cookie-parser :解析客户端cookie中的数据,并将其保存为Request对象的cookie属性

express-session :解析服务端生成的sessionid对应的session数据,并将其保存为Request对象的session属性

query:这个中间件将一个查询字符串从URL转换为JS对象,并将其保存为Request对象的query属性。这个中间件在第四个版本中已经内置了无需安装。

2. 路由

2.1 app.get()

res.send()

res.render()

app.listen()

app.get("/",function(req,res){

res.send("hello");

});

var express = require("express");
var app = express(); app.get("/",function(req,res){
res.send("你好");
}); app.get("/haha",function(req,res){
res.send("这是haha页面,哈哈哈哈哈哈");
}); app.get(/^\/student\/([\d]{10})$/,function(req,res){
res.send("学生信息,学号" + req.params[0]);
}); app.get("/teacher/:gonghao",function(req,res){
res.send("老师信息,工号" + req.params.gonghao);
});
app.listen(3000);

2.2 get访问网址

当用get请求访问一个网址的时候,做什么事情:

app.get("网址",function(req,res){

});

如果想处理这个网址的任何method的请求,那么写all

app.all("/",function(){

});

注意:

所有的GET参数,? 后面的都已经被忽略。 锚点#也被忽略

你路由到/a , 实际/a?id=2&sex=nan 也能被处理。

2.3 正则表达式,获取get参数

正则表达式可以被使用。正则表达式中,未知部分用圆括号分组,然后可以用req.params[0]、[1]得到。

冒号是更推荐的写法。

app.get("/student/:id",function(req,res){
var id = req.params["id"];
var reg= /^[\d]{6}$/; //正则验证
if(reg.test(id)){
res.send(id);
}else{
res.send("请检查格式");
}
});

2.4 获取参数

//冒号
app.get("/:username/:oid",function(req,res){
var username = req.params["username"];
var oid = req.params["oid"]; res.write(username);
res.end(oid);
}); app.listen(3000);

2.5 处理Get,Post请求参数

GET请求的参数在URL中,在原生Node中,需要使用url模块来识别参数字符串。

在Express中,不需要使用url模块了。可以直接使用req.query对象。

app.get("/",function(req,res){
console.log(req.query);
res.send();
});

POST请求在express中不能直接获得,必须使用body-parser模块。使用后,将可以用req.body得到参数。

但是如果表单中含有文件上传,那么还是需要使用formidable模块。

var bodyParser = require('body-parser')

//模板引擎
app.set("view engine","ejs"); app.get("/",function(req,res){
res.render("form");
}); //bodyParser API
app.use(bodyParser.urlencoded({ extended: false })) app.post("/",function(req,res){
console.log(req.body);
});

3. 静态文件访问

app.use(express.static("./public"));

app.set()

app.use()

4.模板引擎

4.1 ejs

使用了ejs的模板引擎

app.set("viwe engine","ejs");

var express = require("express");

var app = express();

app.set("view engine","ejs");

app.get("/",function(req,res){
res.render("haha",{
"news" : ["我是小新闻啊","我也是啊","哈哈哈哈"]
});
}); app.listen(3000);

注意:express4.X 和express3.X 差别非常大。

4.2 传递数据 app.render(view, [locals], callback)

app.get("/",function(req,res){
res.render("haha",{
"news" : ["我是小新闻啊","我也是啊","哈哈哈哈"]
});
});

5. 中间件

5.1 next参数

如果get、post回调函数中,没有next参数,那么就匹配上第一个路由,就不会往下匹配了。

如果想往下匹配的话,那么需要写next()

app.get("/",function(req,res,next){
console.log("1");
next();
}); app.get("/",function(req,res){
console.log("2");
});

路由get、post这些东西,就是中间件,中间件讲究顺序,匹配上第一个之后,就不会往后匹配了。next函数才能够继续往后匹配。

5.2 use()作用

app.use()也是一个中间件。与get、post不同的是,他的网址不是精确匹配的。而是能够有小文件夹拓展的。

比如网址: 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"); // /aa/bb/cc/dd
res.end("你好");
});

静态服务

//静态服务
app.use("/jingtai",express.static("./public"));

6. 内容渲染

● 大多数情况下,渲染内容用res.render(),将会根据views中的模板文件进行渲染。如果不想使用views文件夹,想自己设置文件夹名字,那么

app.set("view engine","ejs")

● 如果想写一个快速测试页,当然可以使用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');

修改时间点:

2019年10月05日12:26:16

22.Express框架——2019年12月19日的更多相关文章

  1. 24.mongodb可视化工具部署——2019年12月19日

    2019年10月09日17:05:54 教程链接:https://blog.csdn.net/qq_32340877/article/details/79142129 项目名:adminMongo g ...

  2. 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.bat 徐晓亮 595076941@qq.com 2019年12月19日6点50分

    @Echo offRem 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.batRem 徐晓亮 595076941@qq.com 2019年12月19日6点50分 Rem 此批处理脚本源代码的 ...

  3. 32.密码学知识-SSL/TLS-9——2019年12月19日

    9. SSL/TLS "SSL/TLS --- 为了更安全的通信" 本章中我们将学习SSL/TLS的相关知识. SSL/TLS是世界上应用最广泛的密码通信方法.比如说,当在网上商城 ...

  4. 31.密码学知识-证书CA/PKI-8——2019年12月19日

    1. 证书 公钥证书(Public-Key Certificate,PKC)其实和驾照很相似,里面记有姓名.组织.邮箱地址等个人信息,以及属于此人的公钥, 并由认证机构(Certification A ...

  5. 29.密码学知识-消息认证码MAC-6——2019年12月19日

    1. 消息认证码 1.1 消息认证 消息认证码(message authentication code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC. 思考改进方案? 从哈希函数 ...

  6. 28.密码学知识-hash函数-5——2019年12月19日

    5. 单向散列函数 "单向散列函数 --- 获取消息的指纹" 在刑事侦查中,侦查员会用到指纹.通过将某个特定人物的指纹与犯罪现场遗留的指纹进行对比,就能够知道该人物与案件是否存在关 ...

  7. 19.go语言基础学习(下)——2019年12月16日

    2019年12月16日16:57:04 5.接口 2019年11月01日15:56:09 5.1 duck typing 1. 2. 接口 3.介绍 Go 语言的接口设计是非侵入式的,接口编写者无须知 ...

  8. 日常Git使用——2019年12月11日16:19:03

    1.git介绍 1.1 什么是git? 什么是Git? 比如一个项目,两个人同时参与开发,那么就把这个项目放在一个公共的地方,需要的时候都可以去获取,有什么改动,都可以进行提交. 为了做到这一点,就需 ...

  9. 36.React基础介绍——2019年12月24日

    2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...

随机推荐

  1. (转)SSL工作原理

    转:https://www.cnblogs.com/bhlsheji/p/4586597.html 挑    希望:SSL使用数据加密.身份验证和消息完整性验证机制,基于TCP和其他的应用层协议提供可 ...

  2. JavaVM & JNIEnv

    JNIEnv提供了大多数的JNI函数.你的本地方法都会接收JNIEnv作为第一个参数.JNIEnv用于本地线程存储.因此,你不能在线程间共享同一个JNIEnv.如果一个代码段没有其他方式获取它自身线程 ...

  3. /etc/init.d# ./redis-server start

    root@ubuntu:/etc/init.d# ll total drwxr-xr-x root root May : ./ drwxr-xr-x root root May : ../ -rwxr ...

  4. 测开之路一百零三:jquery元素和标签的插入与删除

    标签内插入 标签外插入 给标签加标签 !DOCTYPE html><html lang="en"><head> <meta charset=&q ...

  5. adb之mokey的用法

    monkey是安卓稳定性的测试方向 目录 1.使用格式 2.一般命令 3.分析monkey日志 1.使用格式 monkey的固定使用模式如下:[adb shell] monkey [options] ...

  6. IPv6 首部格式

    <图解TCP/IP> 4.8 IPv6的首部格式 IPv6为了减轻路由器的负担,省略了首部校验和字段.因此路由器不再需要计算校验和,从而提高了包的转发效率. 此外,分片处理所用的识别码成为 ...

  7. ecshop 实现“精品、新品、热销”板块出现选项卡效果的方法

    最近做一个网络商城,直接使用ecshop的免费模板,懒得重新做,ecshop建站多日了,一直想在主页的板块中建网页选项卡鼠标经过自动切换效果,百度搜索这方面的内容也没找到合适的,今天一实验,成功了,所 ...

  8. python 递归,深度优先搜索与广度优先搜索算法模拟实现

    一.递归原理小案例分析 (1)# 概述 递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到! (2)# 写递归的过程 1.写出临界条件 2.找出这一次和上一次关系 3.假设 ...

  9. GMS认证测试FQA

    ---摘要 本文档用于收录GMS认证测试的异常问题,提供一般性指导.对于本文档中未提供解答的问题请咨询@开发经理或@领域技术专家 cts测试工具如何获取? A:见Google官网 https://so ...

  10. C++边双缩点,Redundant Paths 分离的路径

    一道比较简单的 关于边双的题,个人感觉难度不大. 求出整个图的边双,根据边双的定义我们可以延伸出 边双的任两个点都有至少两种路径来互相抵达(因为其不存在割边) .不妨将每个边双缩成一个点,样例中的图便 ...