资讯专栏INFORMATION COLUMN

Node.js学习之路24——Express框架的app对象

smallStone / 2859人阅读

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. Etag
ETagHTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证.它的原理是这样的,当浏览器请求服务器的某项资源A时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过ETag返回给浏览器,浏览器把3f80f-1b6-3e1cb03bA同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: "3f80f-1b6-3e1cb03b"的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器200,如果发现A没有变化就给浏览器返回一个304未修改.这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端.

注:HTTP中并没有指定如何生成ETag,哈希是比较理想的选择.

1.3. 建立基本的HTTP服务器
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")); //false
1.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")); // text
1.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

相关文章

  • Node.js学习之路26——Expressresponse对象

    摘要:如果包含字符则将设置为。添加字段到不同的响应头将该字段添加到不同的响应标头如果它尚未存在。 3. response对象 3.1 是否发送了响应头 res.headersSent布尔属性,app是否发送了httpheaders const express = require(express); const bodyParser = require(body-parser); cons...

    davidac 评论0 收藏0
  • Node.js学习之路25——Expressrequest对象

    摘要:对象表示请求并且具有请求查询字符串参数正文标题头等属性对应用程序实例的引用保存了很多对使用中间件的应用程序实例的引用挂载在路由实例上的路径请求主体和和包含在请求正文中提交的数据的键值对默认情况下它是未定义的当您使用体解析中间件如和时将被填 2. request req对象表示http请求,并且具有请求查询字符串,参数,正文,http标题头等属性 app.get(/user/:id, ...

    cocopeak 评论0 收藏0
  • Node.js学习之路27——Expressrouter对象

    摘要:对象大小写敏感默认不敏感保留父路由器的必需参数值如果父项和子项具有冲突的参数名称则该子项的值将优先激活严格路由默认禁用禁用之后正常访问但是不可以访问全部调用或者或者实际上就是的各种请求方法使用路由使用模块方法 Router([options]) let router = express.Router([options]); options对象 caseSensitive,大小写敏...

    NicolasHe 评论0 收藏0
  • Express.js之路(1)

    摘要:什么是它是一个基于平台,快速开放极简的开发框架。在中就是一个重点。这让我们更加注重业务的功能和开发效率。项目运行我们利用框架可以减少我们的代码量,比起之前使用的核心模块构建服务器代码排版更直观。 什么是Express.js? 它是一个基于Node.js平台,快速、开放、极简的web开发框架。在Express中就是一个重点:API。这让我们更加注重业务的功能和开发效率。 如何使用Expr...

    HitenDev 评论0 收藏0
  • Node.js学习之路13——HTTP与HTTPS

    摘要:和的区别服务器使用协议服务器使用协议服务器需要向证书授权中心申请证书一般免费证书何绍需要交费在少许读客户端有要求的情况下也会要求客户端使用证书服务器于客户端之间传输的是明文数据而服务器于客户端之间传输的是经过安全加密后的密文数据服务器通常使 4. HTTP和HTTPS的区别 HTTPS服务器使用HTTPS协议,HTTP服务器使用HTTP协议. HTTPS服务器需要向证书授权(Ce...

    lei___ 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<