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

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:\\Self\\point\\views','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 serverapp.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/personconsole.log(req.baseUrl); // /user/personconsole.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');
})

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

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

相关文章

【pyqt5学习】——对话框QDialog学习(QMessageBox、QColorDialog、QFIleDialog、QFontDialog、QInputDialog)

目录 1、对话框QDialog类别 2、通用对话框 ​编辑 3、消息对话框QMessageBox() 1)消息对话框QMessageBox类型 2)案例 ​编辑 4、输入对话框QInputDialog 1) 类型 2)案例 5、字体格式对话框QFontDialog 6、颜色对话框QColorDialog 1&…

使用 Mesos 管理虚拟机

摘要 为了满足渲染、基因测序等计算密集型服务的需求,UCloud 推出了“计算工厂”产品,让用户可以快速创建大量的计算资源(虚拟机)。该产品的背后,是一套基于 Mesos 的计算资源管理系统。本文简要介绍该系统的结构、Mes…

Val编程-套接字

套接字的介绍:http://zh.wikipedia.org/wiki/Berkeley%E5%A5%97%E6%8E%A5%E5%AD%97 主要分为客户端和服务器。客户端一般是需要主动去链接,需要配置服务器的IP和端口。服务器是被动响应,需要打开相应的端口。端口一般不推荐使用系统端口和常用…

【pyqt5学习】——Qpainter控件学习(文本、图像、各种图形)

目录 1、作用及应用步骤 2、绘制文本drawText() 3、像素级别绘制点(正弦曲线为例) 4、绘制不同样式的直线 5、绘制弧形、圆形、扇形、图像等 6、画刷填充区域QBrush 1、作用及应用步骤 QPainter是一个用于绘制的类,该类可以用于绘制&…

反向代理与Real-IP和X-Forwarded-For(转)

如下图所示,客户端通过Nginx Proxy1 和 Nginx Proxy2 两层反向代理才访问到具体服务Nginx Backend(或如Tomcat服务)。那Nginx Backend如何才能拿到真实客户端IP呢? 接下来我们来看看如何才能获取到客户端真实IP。 场景1  场景1是…

Android studio打开之后 cannot load project: java.lang.NUllpointerException

参考来源:http://bbs.csdn.net/topics/391014393 关闭网络,重新打开Android studio就好了。(但是原因不清楚是为什么?) Internal error. Please report to http://code.google.com/p/android/issuescom.intellij.ide.p…

Val编程-任务编程

不同任务之间可以通过一个标志符来实现互斥事件。 程序代码&#xff1a; Task2 <span style"font-size:12px;">beginwhile truewait(bTaskFlag)cls()gotoxy(1,1)put("这是Task2")gotoxy(1,2)if bTaskFlagput("BFlag:true ")elseput(&…

【pyqt5学习】——拖拽功能(DragDrop)、剪切板(QApplication.clipboard)

目录 1、拖拽功能&#xff08;Drag&Drop&#xff09; 2、剪切板&#xff08;QApplication.clipboard&#xff09; 1、拖拽功能&#xff08;Drag&Drop&#xff09; 选择文本输入框中的文本&#xff0c;移动到下拉框中自动添加步骤&#xff1a; 1、将文本输入框设置为可…

Val编程-特殊函数使用

Waitendmove()和$Waitendmove()使用心得 这是两个部分&#xff0c;程序运行部分和运动堆栈部分&#xff0c;waitendmove是两个部分进行交互的一个函数。 一般情况下waitendmove()速度会降到0&#xff0c;相当于blend等于off. 代码&#xff1a; begincls()userPage()title("…

【pyqt5学习】——QDateTimeEdit控件学习

目录 1、同时显示日期时间QDateTime 2、只显示日期QDate 3、只显示时间QTime 4、设置显示的格式setDisplayFormat 5、 QDateTimeEdit常用信号 6、实例 1、同时显示日期时间QDateTime # 同时显示日期时间dateTimeEdit1 QDateTimeEdit()dateTimeEdit2 QDateTimeEdit(QDat…

复选框做成单选效果

function zlClick($id){ var eles document.getElementById($id).children; var srcEle event.srcElement; for(var i0;i<eles.length;i){ if(srcEle.checked){ if(eles[i].value!srcEle.value){ eles[i].checkedfalse; } } } } 技术领域可信计算 其他 申请日 200020012…

013. MVC5过滤器

微软提供了4中过滤器: 1.Action过滤器: 在Action方法执行之前和Action方法执行之后, 会执行此过滤器中的代码. 比如在执行public ActionResult Index()方法之前或之后; 也可以说是在方法执行前或执行后; 接口: IactionFilter 抽象类名: ActionFilterAttribute 添加一个实现…

Val编程-读取汉字

Val编程-读取汉字 Val编程中&#xff0c;对于汉字的读取不是很友好&#xff0c;利用fileget直接读取记事本产生的文件字符串会导致乱码的产生。因为Val只支持使用utf-8进行编码&#xff0c;因此读取的文本需要进行utf-8格式转换。 在GBK中&#xff0c;汉字占两个字节。并且…

【pyqt5学习】——菜单栏(QMenu())、工具栏QToolBar学习

目录 1、菜单栏&#xff08;QMenu()&#xff09;——一般在窗口顶部 1&#xff09;创建菜单栏步骤 2&#xff09;信号与方法 3&#xff09;实操 2、工具栏——一般在菜单栏下方 1&#xff09;创建步骤 2&#xff09;方法与信号 信号&#xff1a; 方法&#xff1a; 3&am…

【pyqt5学习】——利用Pyqt5连接打印机(QtPrintSupport、QPrintDialog、QPageSetupDialog)

目录 1、利用QtPrintSupport直接连接打印机——不常用 1&#xff09;基本知识 2&#xff09;完整代码案例 3&#xff09;结果 2、 打印对话框QPrintDialog、打印设置对话框QPageSetupDialog 1&#xff09;弹出打印设置对话框 2&#xff09;弹出打印对话框 注&#xff1a…

Exchange Server 2016管理系列课件39.新建本地移动请求

场景通过新建本地移动请求&#xff0c;可以很方便的将用户邮箱从一个数据库迁移到另外一个数据库。1&#xff09;跨平台邮件迁移&#xff1b;&#xff08;低exchange迁移到高版本exchange&#xff09;2&#xff09;数据库平衡与优化&#xff1b;&#xff08;企业当中&#xff0…

【数据库学习】——【汇总】MySQL数据库下载与安装(Msi文件安装和免安装版本)、Navicat下载与安装

目录 1、MySQL数据库下载与安装 1&#xff09;MySQL数据库下载 MySQL官网 MySQL数据库下载 2&#xff09;MySQL 通过msi文件安装 3&#xff09;MySQL免安装版本使用 1&#xff09;将免安装包移动到安装的文件夹位置&#xff1b; 2&#xff09;新建data文件夹 3&#xff…

【数据库学习】——纠错:mysql Authentication plugin ‘caching_sha2_password‘ is not supported

目录 1、环境介绍 2、问题描述 3、原因分析 4、 解决方案 1&#xff09;方法一&#xff1a;直接改成mysql_native_password验证方式 2&#xff09;方案二&#xff1a; 利用sql命令将验证机制修改 ① 打开命令行窗口——cmd ② 登录mysql数据库 ③ 查看不同用户名的身份…

xcode中用pods管理第三方库转

安装pods &#xff1a;http://www.cnblogs.com/wangluochong/p/5567082.html 史上最详细的CocoaPods安装教程 --------------------------------------------- 第一步&#xff1a;Cmmand&#xff0b;空格&#xff0c;搜索"终端"&#xff0c;使用cd命令进入到我们项目…

Val编程-界面编程

由于示教盒是一个黑白的分辨率为&#xff08;14*40&#xff09;的液晶屏&#xff0c;用户交互不是很好&#xff0c;界面不友好。而且没有鼠标导航与触摸屏。 界面编程函数 1.void cls() 2.void title(string sText) 3.void put(string sText), void put(num nValue) 4.void put…