博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript基础学习——Express框架
阅读量:3917 次
发布时间:2019-05-23

本文共 5844 字,大约阅读时间需要 19 分钟。

一、Express框架介绍

Express属于依赖于Node.js的一个后台框架。

基于 Node.js 平台,快速、开放、极简的 Web 开发框架。

学习Express框架的目的:

(1)如何快速构建后台。

(2)获取前端的请求。
(3)获取前端发送过来的数据。
(4)快速连接数据库。
(5)在后台处理相关数据。
(6)将处理的结果发向前端。

二、Express框架官网

https://www.expressjs.com.cn/

  
三、全局安装express

(1)安装express:cnpm i express -g

(2)安装生成器(用来构建后台项目):cnpm i express-generator -g

注意:测试安装是否成功:express --version

如果显示的有版本号,表示安装成功。

四、搭建后台项目环境

express 项目名

或:

express --view=ejs 项目名   

    
--view=ejs表示使用的模板引擎是ejs,如果不设置默认为模板引擎为jade。
  
例:

(1)生成项目

      express --view=ejs myproj
(2)切换目录(进入到生成的项目目录中),安装依赖包
      cd myproj && npm i
(3)在app.js文件的倒数第二行添加设置监听端口的代码:
      app.listen(80,() => {
        console.log('服务器已启动!');
      })
(4)启动项目
      node app

五、项目目录

bin:存放启动项目的脚本文件,默认为www

node_modules:存放所有的项目依赖库
body-parser;用于解析客户端请求的body中的内容,内部使用JSON编码处理、url编码处理以及对于文件的上传处理
cookie-parser:中间件用于获取web浏览器发送的cookie的内容
debug:小的调试工具,输出的是开发者自己在控制台输出的信息
ejs:一个高性能的模板引擎,它是用JS实现的,并且可以供Node.js使用(相当于在HTML中可以实现逻辑的书写)
morgan:输出Node.js服务器接收到的请求的信息
public:静态资源文件,也是我们的工作目录
routes:进行路由设置的文件,相当于MVC中的Controller(控制器)
views:存放模板引擎文件,相当于MVC中的View(视图)
app.js:项目的入口文件,也是应用核心配置文件
package.json:项目依赖配置及开发者信息
package-lock.json:用以记录当前状态下实际安装的各个依赖包的具体来源和版本号,用来锁定安装时包的版本号

六、request请求对象

用于获取前端发送过来的数据。

先写前端页面

login.html

  
login

用户名:

密码:

index.html

  
我的网站 正在建设中

在app.js倒数第二行添加

app.listen(81,()=>{  console.log("服务器已启动");})

(1)获取前端通过get发送过来的数据:req.query.变量;

将这段代码删除

/* GET home page. */router.get('/', function(req, res, next) {  res.render('index', { title: 'Express' });});

在index.js中添加

//解决跨域/*   all:表示响应任意请求,包括get,post  *:表示所有路由  res.header():表示设置响应头  Access-Control-Allow-Origin:表示跨域  'Access-Control-Allow-Origin','*':*表示任意IP,表示下面所有的响应支持任意IP  next():必须要有的,表示这个中间件执行完后,继续执行下面的代码  router.all()必须写在所有路由的前面*/router.all('*', (req, res, next) => {  res.header('Access-Control-Allow-Origin', '*')  next()})//get请求router.get('/login', (req, res, next) => {  //req.query是用在get请求当中,获取前端传来的值  let usr = req.query.usr//获取前端通过get发送过来的数据  let pwd = req.query.pwd  console.log(usr, pwd);  if (usr == 'admin' && pwd == "123456") {    res.send('ok')//将字符串ok发向前端  } else {    res.send('error')  }})

在cmd中输入 node app,打开login.html页面测试即可

(2)获取前端通过post发送过来的数据:req.body.变量;

post也很简单,修改一下即可,别忘了前端代码的type处,也要修改成post

//post请求router.post('/login', (req, res, next) => {  //req.query是用在get请求当中,获取前端传来的值  let usr = req.body.usr//获取前端通过get发送过来的数据  let pwd = req.body.pwd  console.log(usr, pwd);  if (usr == 'admin' && pwd == "123456") {    res.send('ok')//将字符串ok发向前端  } else {    res.send('error')  }})

(3)获取前端通过get/post发送过来的数据

// get/post请求router.all('/login', (req, res, next) => {  //req.query是用在get请求当中,获取前端传来的值  let usr = req.body.usr ? req.body.usr : req.query.usr;  let pwd = req.body.pwd ? req.body.pwd : req.query.pwd;  console.log(usr, pwd);  if (usr == 'admin' && pwd == "123456") {    res.send('ok')//将字符串ok发向前端  } else {    res.send('error')  }  next()})

对get,post同时适用,用router.all()来完成

七、response响应对象

通过前端发过来的请求信息所做的响应,也就是后端发送信息给前端。

都是在index.js中添加

// 发送字符串

router.get('/info', (req, res) => {  res.send('这是一个字符串')})

测试:

// 发送json格式数据

router.get('/data', (req, res) => {  res.json({ id: '0001', name: '张三' })})

测试:

// 发送jsonp数据格式给前端

router.get('/jsonp', (req, res) => {  res.jsonp({ id: '0001', name: '张三' })})

测试:

八、中间件

Express是一个自身功能极简,完全是由路由和中间件构成一个web开发框架。从本质上讲,一个Express应用就是在调用各种中间件。

1、中间件:是一个函数,它可以访问请求对象、响应对象和应用中处于请求-响应循环流程中的中间件(next())。

2、中间件功能:

(1)执行任何代码;

(2)修改请求和响应对象;
(3)终结请求-响应循环;
(4)调用堆栈中的下一个中间件。

3、分类

   

(1)应用级中间件;

(2)路由级中间件;
(3)错误处理中间件;
(4)内置中间件;
(5)第三方中间件。

4、应用级中间件

绑定到express()对象上,使用use()和METHOD()。METHOD是需要处理的HTTP请求方法,如GET,PUT,POST等。实现对路由的过滤。

在匹配路由之前和匹配路由之后做的一系列操作:

匹配路由之前进行路由过滤,检查是否登录、权限过滤等;匹配路由之后,未匹配到任何路由(404页面路由),进行错误处理。

先在routes下面创建application.js

// //没有挂载路径的中间件,每个请求都会执行到// app.use((req, res, next) => {//   console.log('这是应用级中间件!');//   next()// })// //指定路径// app.use('/goods', (req, res, next) => {//   console.log('这是指定路径的应用级中间件');//   next()// })// //指定路径的同时可以传参// app.use('/classic/:type', (req, res, next) => {//   console.log('这是指定路径同时传参的应用级中间件');//   console.log(req.params.type);//   if (req.params.type == 'goods') {//如果参数为goods,将跳转(重定向)到/goods路由下//     res.redirect('/goods')//   }//   next()// })//中间件栈app.use('/list', (req, res, next) => {  console.log('list');  next()}, (req, res, next) => {  console.log('list--->item');  next()})//将app暴露出去module.exports = app

在app.js下面添加

//引入应用级中间件var app1 = require('./routes/application');//使用应用级中间件app.use('/app1', app1);

测试:输入localhost:81/app1

查看cmd即可

5、路由级中间件

路由级中间件和应用级中间件一样,只是它绑定的对象为 express.Router()。路由级使用 router.use() 或router.VERB() 加载。

先在routes下面创建router.js

var express = require('express');var app = new express();var router = express.Router();/* // 没有挂载路径的中间件,通过该路由的每个请求都会执行该中间件router.use(function (req, res, next) {  console.log('Time:', Date.now());  next();}); *//* // 一个中间件栈,显示任何指向 /user/:id 的 HTTP 请求的信息router.use('/user/:id', function (req, res, next) {  console.log('Request URL:', req.originalUrl);  next();}, function (req, res, next) {  console.log('Request Type:', req.method);  next();}); *//*  // 一个中间件栈,处理指向 /user/:id 的 GET 请求router.get('/user/:id', function (req, res, next) {  // 如果 user id 为 0, 跳到下一个路由  if (req.params.id == 0) next('route');  // 负责将控制权交给栈中下一个中间件  else next();}, function (req, res, next) {  // 渲染常规页面  res.render('test');}); */// 处理 /user/:id, 渲染一个特殊页面router.get('/user/:id', function (req, res, next) {  console.log(req.params.id);  res.render('test');});// 将路由挂载至应用app.use('/', router);module.exports = router;

在app.js下面记得注册,和应用级的方式一样

在views下面创建test.ejs

  
 
 
  Document 

aaaaaaaaaaaaaa

6、错误处理中间件

注意:错误处理中间件有 4 个参数,定义错误处理中间件时必须使用这 4 个参数。即使不需要 next 对象,也必须在签名中声明它,否则中间件会被识别为一个常规中间件,不能处理错误。错误处理中间件和其他中间件定义类似,只是要使用 4 个参数,而不是 3 个,其签名如下: (err, req, res,next)。

在app.js下面添加

//错误处理中间件app.use((err, req, res, next) => {  console.log('您出错了');  res.status(500).send(err.message)})app.listen(81, () => {  console.log('服务器已启动!');})

 

转载地址:http://zbvrn.baihongyu.com/

你可能感兴趣的文章
GraphQL:DataLoader的神奇
查看>>
Beetlex之tcp/tls服务压测工具
查看>>
如何在 ASP.NET Core 中使用 Route 特性
查看>>
为 CefSharp 应用内置 C++ 运行环境并启用 AnyCPU 支持
查看>>
解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"...
查看>>
.NET 云原生架构师训练营(模块二 基础巩固 REST && RESTful)--学习笔记
查看>>
2020 .NET 开发者峰会顺利在苏州落幕,相关数据很喜人以及线上直播回看汇总
查看>>
C# 中 ConcurrentDictionary 一定线程安全吗?
查看>>
划入 .NET 6版本目标,微软鼓励开发人员信任第三方库
查看>>
龙芯.NET正式发布 开源共享与开发者共成长
查看>>
【.Net core】EFCore——Code First生成数据库与表
查看>>
跟我一起学Redis之高可用从主从复制开始
查看>>
调试实战 | 通过转储文件分析程序无响应之使用 windbg + IDA 逆向篇
查看>>
如何在 C# 中使用 委托
查看>>
Abp vNext 后台作业hangfire
查看>>
【Azure Show】|第九期 “我的计算机入门之路” 嘉宾秦婷婷&汪宇杰&文轩
查看>>
Dotnet Core多版本API共存的优雅实现
查看>>
如何在 ASP.NET Core Web API 中以三种方式返回数据
查看>>
开源项目葫芦藤:IdentityServer4的实现及其运用
查看>>
Abp vNext异常处理的缺陷/改造方案
查看>>