1.express()
基于Node.js平台,快速、开放、极简的web开发框架。
创建一个Express应用.express()是一个由express模块导出的入口top-level函数.
const express = require("express"); let app = express();1.1 静态资源管理
express.static(root, [options])
express.static,是Express内置的唯一一个中间件.是基于serve-static开发的,负责托管Express应用内的静态资源.
root,参数指的是静态资源文件所在的根目录.
options,对象是可选的,支持以下属性
dotfiles,String类型,服务dotfiles的选项.可能的值是allow,deny,ignore,默认值为ignore
maxAge,以毫秒为单位设置Cache-Control标题头的最大属性或ms格式的字符串,默认为0
etag,Boolean类型,启用或禁用etag生成
extensions,Mixed,设置文件扩展
index,Boolean类型,发送目录索引,设置false为禁用
redirect,Boolean类型,当路径是一个目录时,重定向到尾随/,
etHeaders,Function类型,设置HTTP标头以供文件使用的函数
1.2. EtagETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证.它的原理是这样的,当浏览器请求服务器的某项资源A时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过ETag返回给浏览器,浏览器把3f80f-1b6-3e1cb03b和A同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: "3f80f-1b6-3e1cb03b"的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器200,如果发现A没有变化就给浏览器返回一个304未修改.这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端.1.3. 建立基本的HTTP服务器注:HTTP中并没有指定如何生成ETag,哈希是比较理想的选择.
const express = require("express"); let app = express(); app.get("/", (req, res) => { res.send("hello world"); }); app.listen(3000);1.4. app对象的locals属性
可以在locals对象上自定义属性
app.locals.title = "my express title";
app.locals.email = "express@express.com";
{ settings: { "x-powered-by": true, etag: "weak", "etag fn": [Function: wetag], env: "development", "query parser": "extended", "query parser fn": [Function: parseExtendedQueryString], "subdomain offset": 2, "trust proxy": false, "trust proxy fn": [Function: trustNone], view: [Function: View], views: "E:Selfpointviews", "jsonp callback name": "callback" }, title: "my express title", email: "express@express.com" }1.5. app.all(path, callback(req, res, next){...})
app.all("*", fn1, fn2...) // 等价于 app.all("*", fn1) app.all("*", fn2)1.6. 删除请求路由
app.delete(path, callback [, callback ...])
将HTTP删除请求路由到具有指定回调函数的指定路径
app.delete("/", function (req, res) { res.send("DELETE request to homepage"); });1.7. 禁用启用某个属性
禁用app.disable(name),app.disabled(name)
启用app.able(name),app.abled(name)
app.set("username", "express server"); console.log(app.get("username")); //express server app.set("username", "express server"); app.disable("username"); console.log(app.get("username")); //false1.8. 模板引擎
app.engine(ext, callback)
根据不同的模板引擎的扩展名,使用不同的模板
app.engine("jade", require("jade").__express); app.engine("html", require("ejs").renderFile);1.9. 设置与获取属性
app.set("title", "text"); console.log(app.get("title")); // text1.10. get请求
app.get(path, callback [, callback ...])
将HTTP获取请求路由到具有指定回调函数的指定路径
app.get("/", function (req, res) { res.send("GET request to homepage"); });1.11. 监听端口
app.listen(port, [hostname], [backlog], [callback(err)])
监听端口,主机,最大连接数量,回调函数
const express = require("express"); let app = express(); app.get("/", function (req, res) { res.send("home page"); }); app.listen(3000, "localhost", 100, function (err) { if (err) { console.log("error"); } else { console.log("the http server is running at localhost:3333"); } });1.12. 路由参数
app.param([name],callback(req, res, next, id){...})
将回调触发器添加到路由参数, 其中名称是参数的名称或它们的数组, 函数是回调函数.回调函数的参数是请求对象、响应对象、下一个中间件以及该参数的值 (按该顺序).如果 name 是一个数组, 则回调触发器按声明的顺序注册在其中声明的每个参数.此外, 对于每个已声明的参数, 除了最后一个外, 回调中的下一个调用将调用下一个声明的参数的回调.对于最后一个参数, 调用 next 将调用当前正在处理的路由的下一个中间件, 就像如果名称只是一个字符串一样.
参数是一个字符串
app.param("id", (req, res, next, id) => { console.log("called only once"); next(); }); app.get("/user/:id", (req, res, next) => { console.log("although this matches"); next(); }); app.get("/user/:id", (req, res) => { console.log("this matches too"); res.send("end user id"); }); /** called only once although this matches this matches too */
参数是一个数组
app.param(["id", "page"], (req, res, next, id) => { console.log("called only once", id); next(); }); app.get("/user/:id/:page", (req, res, next) => { console.log("although this matches"); next(); }); app.get("/user/:id/:page", (req, res) => { console.log("this matches too"); res.send("end user id"); }); /** called only once kkk called only once 555 although this matches this matches too */1.13. app.path()
返回应用程序的规范化路径
let express = require("express"); let app = express(); let blog = express(); let blogAdmin = express(); app.use("/blog", blog); blog.use("/admin", blogAdmin); console.log(app.path()); console.log(blog.path()); console.log(blogAdmin.path());1.14. 模板渲染
app.render(view, [locals], callback(err,html){...})
回调函数返回视图的呈现 HTML
1.15. 路由设置app.route(path)
返回单个路由的实例
app.route("/one") .all(function (req, res, next) { console.log("route all"); next(); }) .get(function (req, res, next) { res.json({ code: 2589, msg: "route get msg" }); }) .post(function (req, res, next) { res.send("this is route post send msg"); });1.16. 中间件
app.use([path,] callback(req, res, next){...})
在路径上装载中间件函数.如果未指定路径, 则默认为/
路径可以是表示路径、路径模式、匹配路径的正则表达式或其组合数组的字符串
app.use()中间件可以使用正则匹配路径,可以有多个中间件函数
可使用的地方
app.use(express.static(__dirname + "/public")); app.use("/static", express.static(__dirname + "/public")); app.use(express.static(__dirname + "/public")); app.use(logger()); app.use(express.static(__dirname + "/public")); app.use(express.static(__dirname + "/files")); app.use(express.static(__dirname + "/uploads"));
中间件示例
app.use("/user/person", (req, res, next) => { console.log(req.originalUrl); // /user/person console.log(req.baseUrl); // /user/person console.log(req.path); // / next(); });
如果使用了app.use(callback()),就不会触发app.get("/", callback())
// this middleware will not allow the request to go beyond it app.use((req, res, next) => { res.send("Hello World"); }) // requests will never reach this route app.get("/", (req, res) => { res.send("Welcome"); })
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/93059.html
摘要:如果包含字符则将设置为。添加字段到不同的响应头将该字段添加到不同的响应标头如果它尚未存在。 3. response对象 3.1 是否发送了响应头 res.headersSent布尔属性,app是否发送了httpheaders const express = require(express); const bodyParser = require(body-parser); cons...
摘要:对象表示请求并且具有请求查询字符串参数正文标题头等属性对应用程序实例的引用保存了很多对使用中间件的应用程序实例的引用挂载在路由实例上的路径请求主体和和包含在请求正文中提交的数据的键值对默认情况下它是未定义的当您使用体解析中间件如和时将被填 2. request req对象表示http请求,并且具有请求查询字符串,参数,正文,http标题头等属性 app.get(/user/:id, ...
摘要:对象大小写敏感默认不敏感保留父路由器的必需参数值如果父项和子项具有冲突的参数名称则该子项的值将优先激活严格路由默认禁用禁用之后正常访问但是不可以访问全部调用或者或者实际上就是的各种请求方法使用路由使用模块方法 Router([options]) let router = express.Router([options]); options对象 caseSensitive,大小写敏...
摘要:什么是它是一个基于平台,快速开放极简的开发框架。在中就是一个重点。这让我们更加注重业务的功能和开发效率。项目运行我们利用框架可以减少我们的代码量,比起之前使用的核心模块构建服务器代码排版更直观。 什么是Express.js? 它是一个基于Node.js平台,快速、开放、极简的web开发框架。在Express中就是一个重点:API。这让我们更加注重业务的功能和开发效率。 如何使用Expr...
摘要:和的区别服务器使用协议服务器使用协议服务器需要向证书授权中心申请证书一般免费证书何绍需要交费在少许读客户端有要求的情况下也会要求客户端使用证书服务器于客户端之间传输的是明文数据而服务器于客户端之间传输的是经过安全加密后的密文数据服务器通常使 4. HTTP和HTTPS的区别 HTTPS服务器使用HTTPS协议,HTTP服务器使用HTTP协议. HTTPS服务器需要向证书授权(Ce...
阅读 2422·2023-04-26 02:18
阅读 1176·2021-10-14 09:43
阅读 3770·2021-09-26 10:00
阅读 6794·2021-09-22 15:28
阅读 2481·2019-08-30 15:54
阅读 2554·2019-08-30 15:52
阅读 428·2019-08-29 11:30
阅读 3420·2019-08-29 11:05