Node.js:Express
Express
什么是 Express ?
- Express 是一个基于 Node.js 封装的上层服务框架,它提供了更简洁的 API, 更实用的新功能
- Express通过中间件和路由让程序的组织管理变的更加容
- Express提供了丰富的 HTTP 工具, 它让动态视图的渲染变的更加容易, 此外, 还定义了一组可拓展标准
- Express是目前最流行的node.js后端框架之一, 相当于jQuery和js之间的关系
- Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功能
- 功能类似的后端框架:Koa.js, egg.js
为什么要使用Express?
- nodejs提供了的方法处理起来比较麻烦,在使用nodejs时有很多现成的框架帮助开发人员,其中最简单的一个server框架就是Express
- 两种使用方式
① 在项目文件夹中安装express
② 通过express的generator来生成一个express的骨架
安装express
- 进入应用目录
npm init
命令为你的应用创建一个 package.json 文件- 安装 Express 并将其保存到依赖列表中
npm install express --save
- 如果只是临时安装 Express,不想将它添加到依赖列表中,只需略去 --save 参数即可
npm install express
- Express 应用生成器
通过应用生成器工具 express 可以快速创建一个应用的骨架。
① 安装
npm install express-generator -g
② 常用操作
express -h
-h 选项可以列出所有可用的命令行选项
安装所有依赖包
npm install
③ 设置视图模板
express --view=ejs demo1
④ 启动应用
MacOS 或 Linux 平台
DEBUG=myapp npm start
Windows 平台
set DEBUG=myapp & npm start
在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了
⑤ 通过 Express 应用生成器创建的应用一般都有如下目录结构
中间件
中间件是如何工作的?
原生Node中, http请求/响应处理都在一个函数中
① 代码let requestHandler = (request, response) => {console.log("In comes a request to: " + request.url);response.end("Hello, world!"); }
② 图示
注意
这并不是说在处理过程中不能调用其它函数,而是所有的请求响应都由该函数发送中间件则使用一组中间件栈函数来处理这些请求
① 图示
② 作用
用来处理 http 请求的一个具体的环节(可能要执行某个具体的处理函数)
中间件一般都是通过修改 req 或者 res 对象来为后续的处理提供便利的使用
③ 注意
任何请求进来都会执行对应的处理函数
不关心当前请求的具体请求方法和请求路径
中间件分类?
use(‘请求路径’, (req, res, next)=>{})
get(‘请求路径’, (req, res, next)=>{})
post(‘请求路径’, function (req, res, next) {})
第三方中间件类库
- MORGAN:日志记录中间件
- 安装
npm install morgan --save
- Express 的静态文件中间件
- 安装
实操
- 在 http 中,没有请求就没有响应,服务端不可能主动给客户端返回响应,就是一问一答的形式
- 对于一次请求来说,只能响应一次,如果发送了多次响应,则只有第一次生效
next()是执行下一个路由
// 1. 引入 const express = require('express'); const fs = require('fs'); const path = require('path');// 2. 创建web服务器 const app = express();// 4. 写日志 app.use((req, res, next)=>{const log = `----------------------------------------1) 请求的方式: ${req.method}, \n2) 请求的路径: ${req.url}, \n3) 请求的时间: ${new Date()}, \n----------------------------------------`;// 写入文件fs.appendFile(path.join(__dirname, 'req.log'), log, (err)=>{if(err) throw err;next();}); });// 加入很多很多中间件 app.use((req, res, next)=>{console.log('1111111');next(); });app.use((req, res, next)=>{console.log('2222222');next(); });app.use((req, res, next)=>{console.log('333333');next(); });app.get('/', (req, res, next)=>{res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});res.write('<h2>Hello, World!</h2>');next(); });app.get('/', (req, res)=>{res.write('<h2>您好,撩课学院!</h2>');res.end(); });// 3. 开启监听 app.listen(3000, ()=>{console.log('服务器已经启动!'); });
Express重点操作
Hello World
// 1. 引入 const express = require('express');// 2. 调用 express() 方法,得到一个 app 实例接口对象 //(类似于 http.createServer 得到的 server 实例) const app = express();// 3. 通过 app 根据路径处理 get 和 post 请求 app.get('/', (req, res)=>{res.write('<h1>hello</h1>');res.end() });app.get('/itlike', (req, res)=>{res.end('<h1>hello, itLike</h1>') });// 4. 开启监听,启动服务器 app.listen(3000, () => {console.log('服务已经启动!') });
静态资源文件
app.use('/public', express.static('开放目录的路径'))
在 use 方法中,如果指定了第一个路径参数,则通过 req.path 获取到的是不包含该请求路径的字符串
例如当前请求路径是 /public/test.jpg, 则通过 req.path 拿到的就是 test.jpg
使用app.use('/static', express.static(path.join(__dirname, 'static')));
错误/异常统一处理
Express 使用模板引擎
const express = require('express');
const path = require('path');
const app = express();// 注册模板引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');app.get('/', (req, res)=>{const dataJson = {"lists":[{"title": "撩课学院1周年庆倒计时", "count": 675593, "up": 1},{"title": "女演员全美善自杀", "count": 634434, "up": 1},{"title": "哈登骑电动车被抓", "count": 623323, "up": 0},{"title": "吃酸辣粉被罚款", "count": 546767, "up": 0},{"title": "蔚来汽车庄莉离职", "count": 536237, "up": 1},{"title": "父母抓阄陪女儿", "count": 525193, "up": 0},{"title": "宋仲基爸爸短信", "count": 475593, "up": 0},{"title": "宋仲基爸爸短信", "count": 375593, "up": 1},{"title": "今天天气很好", "count": 275593, "up": 1}],"source": "撩课风云榜 - itLike.com"};res.render('list', dataJson);
});app.listen(3000, ()=>{console.log('服务器已经启动');
});
统一的错误处理日志中间件
app.use((err, req, res, next)=>{const error_log = `=====================================错误名: ${err.name}, \n错误信息:${err.message}, \n错误时间:${new Date()}, \n错误堆栈:${err.stack}, \n=====================================`;fs.appendFile(path.join(__dirname, 'error.log'), error_log, (err)=>{res.writeHead(500, {'Content-Type': 'text/html;charset=utf-8'});res.end('500 服务器内部错误!')});
});
Express 应用生成器(脚手架)
通过应用生成器工具 express 可以快速创建一个应用的骨架。
安装
npm install express-generator -g
-g全局安装
常用操作
express -h
-h 选项可以列出所有可用的命令行选项
安装所有依赖包
npm install
设置视图模板
express demo1 --view=ejs
启动应用
MacOS 或 Linux 平台
DEBUG=myapp npm start
Windows 平台
set DEBUG=myapp & npm start
在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了
通过 Express 应用生成器创建的应用一般都有如下目录结构
app.js
// 1.引入所有的包依赖文件
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');// 2. 引入路由文件
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');// 3. 创建web服务器
const app = express();// 4. 设置模板引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');// 5. 使用各种中间件
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));// 6. 配置路由
app.use('/', indexRouter);
app.use('/users', usersRouter);// 处理找不到页面
app.use(function(req, res, next) {next(createError(404));
});// 统一处理错误
app.use(function(err, req, res, next) {// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});module.exports = app;
7) socket.io
socket.io 是什么?
- Socket.io 将 Websocket 和轮询( Polling )机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。
- H5 的新技术 Websocket 仅仅是 Socket.io 实现实时通信的一个子集。
如何使用socket.io?
- 安装
npm install socket.io --save
进入 package.json 所在的目录下, 运行上面命令 - 引入
// 引入包
let socketPackage = require('socket.io');
// 针对 http server 生成 socket.IO 实例对象
let io = socketPackage(server);
使用 socket.IO 的时候,需要生成一个 实例对象;
生成这个实例对象的依赖原生 node 已经建立好的 httpServer 对象
常用API?
服务器端
监听连接
io.on('connection',function(socket));
当有客户端向本服务器建立连接的时候, ‘connection’ 事件就被激发。对应的回调函数就会执行。回调函数的参数 socket 就是这个客户端与服务器的 连接对象
给所有客户端广播消息
io.sockets.emit('String',data);
服务器主动向客户端发送消息, 消息的事件名为 myEvnetLabel , 消息的具体内容为 data
给指定的客户端广播消息
io.sockets.socket(socketid).emit('String', data);
监听客户端消息
socket.on(‘myEvnetLabel’,function(data){});
当某个客户端向服务器发送消息的时候,服务器监听这个消息,并将其回调函数执行
浏览器端
开启连接
let url = 'http://localhost:3000'; let socket = io.connect(url);
监听服务器的消息
socket.on('myEvnetLabel',function(data){});
当服务器有消息到达的时候,回调函数会被激发
- 向服务器发送消息
socket.emit(‘myEvnetLabel’, data);
客户端主动向服务器发送消息, 消息的事件名为 myEvnetLabel , 消息的具体内容为 data
客户端socket.on()监听的事件
connect:连接成功
connecting:正在连接
disconnect:断开连接
connect_failed:连接失败
error:错误发生,并且无法被其他事件类型所处理
message:同服务器端message事件
anything:同服务器端anything事件
reconnect_failed:重连失败
reconnect:成功重连
reconnecting:正在重连
当第一次连接时,事件触发顺序为:connecting->connect;当失去连接时,事件触发顺序为:disconnect->reconnecting(可能进行多次)->connecting->reconnect->connect。
Node.js:Express相关推荐
- 使用 Node.js、Express、AngularJS 和 MongoDB 构建一个Web程序
为什么80%的码农都做不了架构师?>>> 使用 Node.js.Express.AngularJS 和 MongoDB 构建一个实时问卷调查应用程序 2014 年 3 月 20 ...
- Installing Node.js and Express on Ubuntu
Installing Node.js and Express on Ubuntu 1. 在nodejs官网上下载Linux Binaries(已经包含了npm): 2. 安装Node.js 下载后解压 ...
- 如何使用Node.js,Express和MongoDB设置GraphQL服务器
by Leonardo Maldonado 莱昂纳多·马尔多纳多(Leonardo Maldonado) 如何使用Node.js,Express和MongoDB设置GraphQL服务器 (How to ...
- js和python哪个好_Python与Node.JS:哪一个比较适合您的项目?
在进行新项目时选择正确的编程语言可能是程序员经常做出的比较艰巨的决定之一. 这个挑战背后的原因是,每个新项目都会遇到一个独特的问题,并且在编程世界中,没有任何行业的大师. 不同的编程语言都有其长处和短 ...
- node.js安装express(零起点搭建本地测试服务器)- 教程篇
(含图文教程.代码对比,等)node.js安装express(零起点搭建本地测试服务器)- 教程篇 原教程 · 参考地址 执行step3之后,结果截图 · 如下图2 : 之后,执行step4,截图如下 ...
- Node.js:一个路由2次 request
node.js 和其他服务器端编程语言有很大区别,语言上的特性优点已经在前面分享过,这里就不说了. 与其他语言相比,还有一个区别,node.js 自身实现了一个服务器,而其他服务器端语言大部分要依赖A ...
- Node.js:项目中的 package.json 格式
1. node.js 项目包下的 package.json : 实例: {"name" : "chatroooms","version" : ...
- 用node.js和express.js和jade搭建轻型cms系统
http://cnodejs.org/topic/4f16442ccae1f4aa270010bf 前言: 我们主要做的是iphone/ipad程序,但关注node.js很久,因为我们多少总是要做网站 ...
- node JS獲取GPS_Python与Node.JS:哪一个最适合您的项目?
使用一组预定义因素对Python和Node.js进行详细比较 > Photo by Tim van der Kuip on Unsplash 在进行新项目时选择正确的编程语言可能是程序员经常做出 ...
- Node.js:海量数据大行其道的今天 node.js 在IO方面如何异步非阻塞
以其高性能,异步IO著称,当然node.js 在 stream 上的异步也非常到位. 我们一般理解的异步请求是这样的: 同时处理多件件事件 A,B,C,D,E,F,G .... 如果用.net语言去处 ...
最新文章
- ActiveMQ消息的延时和定时投递
- 学校工作必备ASP程序
- (数据库系统概论|王珊)第四章数据库安全性-第一节:数据库安全性概述
- 简述html文件的基本标记组成_HTML是什么呢?
- 重大要素改变中的机会选择包括_重大要素改变中的机会选择包括:
- unity3d从零開始(五):了解摄像机
- 激活中国汽车媒体圈,杉车网与尾部汽车媒体的九死一生
- oracle安装5.1,5.1 Oracle RAC的安装(5)
- chrome提示安装unity web player
- SCC(三):HEVC IBC
- 解决@Override错误
- 思科cisco策略路由基本概念
- Low-Light Image and Video Enhancement Using Deep Learning: A Survey 论文阅读笔记
- 403 forbidden 错误解决方案
- 清华大学计算机刘云鹏,清华大学2017年在豫高招录取结束
- 搭建Maven私服Nexus
- 企业想要制作电商类App软件
- 这次我真心想告诉你:分手吧!
- 全面认识思科交换机产品
- Unity TouchScripts实例 - 判断在物体上滑动