Express

Express,第1张

Express

目录

Express

一、安装Express二、基本使用三、中间件

1.最普通的中间件2.匹配路径中间件3.匹配路径和请求方法中间件4.连续注册中间件5.中间件应用 四、客户端发送请求的方式

1.传递参数params2.传递参数query 五、响应数据六、express路由七、静态资源服务器八、服务端的错误处理

Express

Express整个框架的核心就是中间件。

一、安装Express

方式一:通过express提供的脚手架,直接创建一个应用的骨架;

安装脚手架 npm install -g express-generator

创建项目 express express-demo

安装依赖 npm install

启动项目 node bin/www

方式二:从零搭建自己的express应用结构;

生产package.json文件:npm init -y

手动安装express: npm install express

二、基本使用

请求的路径中如果有一些参数,可以这样表达:

users/:userId;在request对象中药获取可以通过 req.params.userId;

返回数据,我们可以方便的使用json:

res.json(数据)方式;可以支持其他的方式,可以查看文档;https://www.expressjs.com.cn/guide/routing.html 三、中间件

中间件的本质是传递给express的一个回调函数;这个回调函数接受三个参数:

请求对象(request对象);响应对象(response对象);next函数(在express中定义的用于执行下一个中间件的函数);

1.最普通的中间件
const express = require('express')
const app = express();
// 编写普通的中间件
// use注册一个中间件(回调函数)
// 默认响应第一个中间件
// 若需要响应其他中间件,需要调用next()
app.use((req, res, next) => {
  console.log("注册了第1个普通的中间件");
  res.end("hello world");
  next();
})

app.use((req, res, next) => {
  console.log("注册了第2个普通的中间件");
  // res.end("hello world");  //前面已经调用过end了,已经结束了周期,再调用会报错
  // 所以一般end出现在最后一个普通中间件
  next()
})

app.use((req, res, next) => {
  console.log("注册了第3个普通的中间件");
})

app.listen(8000, () => {
  console.log("普通中间件服务器启动成功");
})
2.匹配路径中间件
const express = require('express')
const app = express();

// 中间件:查找所有路径匹配的中间件,只执行第一个满足的中间件,除非第一个中调用了next

app.use((req, res, next) => {
  console.log("home middleware 03");
  res.end("01");
  // next();
})

// 路径匹配中间件  与请求关系无关,与路径有关
app.use('/home', (req, res, next) => {
  console.log("home middleware 01");
  res.end("01");
  next();
})
// 永远是第一个中间件
app.use('/home', (req, res, next) => {
  console.log("home middleware 02");
})

app.listen(8000, () => {
  console.log("普通中间件服务器启动成功");
})
3.匹配路径和请求方法中间件
const express = require('express')
const app = express();
// 路径和方法都匹配的中间件
app.get('/home', (req, res, next) => {
  console.log("home path and method middlelevel01");
})

app.post('/home', (req, res, next) => {
  console.log("home path and method middlelevel02");
})

app.listen(8000, () => {
  console.log("普通中间件服务器启动成功");
})
4.连续注册中间件
const express = require('express')
const app = express();

app.use((req, res, next) => {
  console.log("home middleware 01");
  next();
})

app.get('/home', (req, res, next) => {
  console.log("home middleware 01");
  next();
}, (req, res, next) => {
  console.log("home middleware 02");
  next();
}, (req, res, next) => {
  console.log("home middleware 03");
  next();
}, (req, res, next) => {
  console.log("home middleware 04");
  res.end();
})

app.listen(8000, () => {
  console.log("普通中间件服务器启动成功");
})
5.中间件应用

body解析:

const express = require('express')
const app = express();
// 处理body信息
// app.use((req, res, next) => {
//   if (req.headers["content-type"] === 'application/json') {
//     req.on('data', (data) => {
//       console.log(data.toString());
//       const info = JSON.parse(data.toString())
//       req.body = info;
//     });
//     req.on('end', () => {
//       next();
//     })
//   }
// })

// 手写太麻烦了。有写好的
// body-parser
app.use(express.json())
// extended :
// true:对urlencoded解析时用的第三方库:qs
// false:对urlencoded解析时用的Node内置模块:querystring
app.use(express.urlencoded({extended:true}))//解析的是 application/x-www-form-urlencoded:



app.post('/login', (req, res, next) => {
  console.log(req.body);
  res.end("coder, welcome back");
})
app.post('/products', (req, res, next) => {
  console.log(req.body);
  res.end("uplog");
})

app.listen(8000, () => {
  console.log("普通中间件服务器启动成功");
})

请求日志记录:使用第三方中间件:morgan(需要单独安装)

const fs = require('fs')
const express = require('express')
const morgan = require('morgan')

const app = express();

const writeStream = fs.createWriteStream('./logs/access.log', {
  flags: 'a+'
})

app.use(morgan("combined", {stream: writeStream}))
app.get('/home', (req, res, next) => {
  res.end("hello")
})
app.listen(8000, () => {
  console.log("解析服务器启动成功");
})

上传文件中间件 – 添加后缀名:这里不在详细演示

四、客户端发送请求的方式

客户端传递到服务器参数的方法常见的是5种:

方式一:通过get请求中的URL的params;方式二:通过get请求中的URL的query;方式三:通过post请求中的body的json格式(中间件中已经使用过);方式四:通过post请求中的body的x-www-form-urlencoded格式(中间件使用过);方式五:通过post请求中的form-data格式(中间件中使用过);

1.传递参数params

请求地址:http://localhost:8000/login/abc/why

2.传递参数query

请求地址:http://localhost:8000/login?username=why&password=123

const express = require('express')
const app = new express();

app.use('/login/:id/:name', (req, res, next) => {
  console.log(req.params); // { id: 'abc', name: 'why' }
  res.end('请求成功')
})

app.use('/login', (req, res, next) => {
  console.log(req.query); // { username: 'why', password: '123' }
  res.end('请求成功')
})

app.listen(8000, () => {
  console.log("express初体验服务器启动~");
})
五、响应数据

end方法 :类似于http中的response.end方法,用法是一致的json方法 :json方法中可以传入很多的类型:object、array、string、boolean、number、null等,它们会被转换成 json格式返回;status方法:用于设置状态码;更多响应的方式:https://www.expressjs.com.cn/4x/api.html#res 六、express路由

使用 express.Router来创建一个路由处理程序: 一个Router实例拥有完整的中间件和路由系统;

路由:

const express = require('express')
const router = express.Router();

router.get('/', (req, res, next) => {
  res.json(["why","koce","dksf"])
})

router.get('/:id', (req, res, next) => {
  res.json(`${req.params.id}用户信息`)
})

router.post('/', (req, res, next) => {
  res.json("sdfsdf")
})

module.exports = router;

请求:

const express = require('express')
const router = require('./12.express路由1')

const app = express();

app.use('/user', router);
app.use('/user/id', router);

app.listen(8000, () => {
  console.log("启动成功");
})
七、静态资源服务器

Node也可以作为静态资源服务器,并且express给我们提供了方便部署静态资源的方法static()

八、服务端的错误处理

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5707898.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存