express的web服务器与api服务器

express

1.express web 服务器
2.express api 服务器

.express web 服务器 操流程
1.使用express搭建静态服务器

  • 静态服务器
  • 后端渲染:
    后端语言+后段渲染 生成前端的HTML结构然后发送到前台
    2.安装express模块
    3.创建服务器
    4.读取文件发送给前台
    5.通过app对象和中间件把文件发送给前台 app.get(‘路由路径’,(三个参数)=>{})

const express = require('express')
const app = express()
const port = 3060;
const host = 'localhost'
const fs = require('fs')
app.get('', (req, res, next) => {
fs.readFile('./html/index.html', 'utf8', (error, data) => {
if (error) {
console.log(error)
} else {
res.send(data)
}
})
})
app.listen(port, host, () => {
console.log(`服务器运行在:http://${host}:${port}`)
})


2.express api 服务器 流程

在api服务器中:一个路由就是一个api 也就是一个后端接口

1.安装express模块
2.创建服务 其中监听服务器不用输出路径
3.同级目录下创建路由文件夹(router)

4.在路由文件夹中创建路由文件
5.路由文件也要安装express
6.创建router模块 const router=express.Router()得到路由对象
7.打造接口
- 格式:router.get( 路由路径, 回调函数 ) 回调函数内写返回的数据
8.模块导出 module.exprets=router


const express = require('express')
const router = express.Router()
router.get('', (req, res, next, ) => {//如果前面加了/home 测试接口的时候也要加上该地址
res.json({
name: 'lisalisa',
age: 18
})
})
module.exports = router


9.引入模块儿 const userRouter=require(‘路由的路径’)
10.使用app.use(‘’,userRouter)使用引入的模块

const express = require('express')
const app = express()
const port = 3070
const host = 'localhost'
const userRouter = require('./router/user')
app.use('', userRouter)
app.listen(port, host, () => {
console.log('api服务器')
})

express-generator

(快速生成工具)

1.安装 【两种方式】

  • 全局安装

$ cnpm i express-generator -g
express -e 项目名称

  • 不使用全局安装

$ npx express -e 项目名称 -e表示使用ejs模板 -e是可以换的

  1. 项目目录结构
    bin
    www 创建服务器,并监听服务器
    public 静态资源目录
    img
    css
    routes
    路由文件
    view
    模板文件 ejs/pug
    app.js 整个项目的入口文件
    中间件绑定的
    中间件类型 【 3种 】
    • 应用级中间件( 只是一个单一功能, 如:绑定静态资源目录)
    • 路由中间件 ( 暴露一个路由 )
    • 错误处理中间件 ( 处理项目的错误 )
      package.json
      记录项目依赖包配置信息和项目的命令脚本\

后端渲染
使用get
1.在自动生成的routers文件夹建立需要渲染的数据打造接口 与服务端进行连接

  • 安装express模块

  • 创建路由

  • 打造接口,回调里面写返回的数据

  • 暴露接口

  • 安装request模块 请求数据

  • 请求渲染的路径

  • 检查返回的数据是什么类型(是否需要转类型)

  • 将数据发出去用res.render(’’,{})

  • 在views下新建cart.ejs

  • 这个页面是前端显示的页面

  • 用ejs语法


<!-- 数据展示 -->
<h3 style = "background: red;"> <%= data.msg %> </h3>
<!-- 非转义输出 将xml类型数据 解析 -->
<div>
<%- data.msg %>
</div>

<!-- 流程控制 if while for -->

<% if ( data.flag ) {%>
<h3> 这里是flag为true </h3>
<% } %>


<% if ( data.flag ) {%>
<h4> 这里是true </h4>
<%} else {%>
<h5> 这里是false </h5>
<%}%>
<!-- 列表循环 -->
<ul>
<% data.lists.forEach( function ( item ) {%>
<li>
<h3> 商品名称: <%= item.shopName %> </h3>
<h4> 商品价格: <%= item.price%> </h4>
</li>
<% })%>
</ul>

以渲染拉勾的一段数据到前端页面为例

  • 以cart.js为例
const express=require(‘express’)
const router=express.Router()
 const request=require('request')
 
 router.get('',(req,res,next)=>{
 request('
'https://m.lagou.com/listmore.json',(error,response,body)=>{
    此时输出的body类型为字符串所以要转成对象
    const result=JSON.parse(body).content.data.page.result
    
    res.render('cart',{
        data;{
        result,
        msg:true
        }
    }) 
 })
 })
 module.exports=router
  • 服务器要引入cat.js路由模块
var cartRouter = require( './routes/cart' )

  • 绑定中间件
app.use('/cart', cartRouter )

这样就可以渲染一个数据到前端页面了

  1. 问题: 二阶段使用php来暴露接口的时候,大家如何暴露的?
    以前:
    购物车接口 ( CURD)
    增 : http://localhost:3000/shopcar/add
    删 : http://localhost:3000/shopcar/del
    改 : http://localhost:3000/shopcar/update
    查 : http://localhost:3000/shopcar/search

现在:
购物车接口 ( CURD )
接口只有一个,但是请求方式【 7个 】多个
增 : post请求
http://localhost:3000/shopcar

删 : delete请求
http://localhost:3000/shopcar
改 : put请求
http://localhost:3000/shopcar
查 : get请求
http://localhost:3000/shopcar
put和delete会自动携带 请求 options 请求
上面这种规则就是 restful api
restful api就是接口暴露的规则

文件系统版的登录注册

1.安装自定义的api-server文件

  • npx express -e api-server
    2.装依赖 npm i
    3.在router文件下打造一个登录注册的接口 (以下以form.js为例)
  1. 登陆注册需要添加数据查询数据所以需要以下的大局:

1.安装express模块
const express = require (‘express’)

2.此时是用express打造路由接口所以需要创建路由
3. 导出模块
4.路由创建好了需要去服务端进行引用和创建路由中间件
5.这里需要些多个任务 所以把router.get(’’,()=>{})改写成多个任务需要路径单独写 (如下)
6.首先需要注册 注册时往数据库里面添加数据所以用post 方法

12.保存代码需要保存(以新建一个data文件夹为例)
13.保存需要先获取前端代码 req.body 显示前端发来的数据
14.往文件里添加数据需要引读取文件的fs
15.往data文件夹里面写文件:fs.write()
16.写文件需要的路径必须是磁盘路径所以引用path

const router=express.Router()

const fs=require('fs')
const path=reqire('path')
router
        .route('/form')// 这里写了路径在服务端1引用的路由中间件的时候就不需要写路径了
            // .get()   查找数据
            //.post() 添加数据
            //.delete() 删除数据
            //.put() 修改数据
       .post((req,res,next)=>{
        
fs.writeFile(
path.join(__dirname, '../data/user.txt'),
JSON.stringify(req.body),
(error) => {
    
if (error) throw error
console.log('保存成功')
})

res.render('form', {
data: JSON.stringify({
res: true,
status: '添加成功',
})
})




)

     
       })




module.exports=router

7.注册需要注册页面
8.在api-server同级目录下创建前端FE文件添加注册页面
9.给注册按钮添加点击事件 发送ajax请求 把数据发送给后端
10.我们需要读取发来的数据然后用post方法保存下来
11.后端接收数据并保存(如上面代码)


<script>
$('.register').on('click', function() { //点击注册把注册的信息提交给后端
$.ajax({
type: "POST",
url: "http://localhost:3000/form",
data: {
username: $('.username').val(),
password: $('.password').val()
},
success: function(response) {
console.log(response)
}
});
})
</script>


17.登录页面 .登录 发送 get ajax


<script>
//获取dom
$('.register').on('click', function() {
//发ajax
$.ajax({
url: 'http://localhost:3000/form',
method: 'GET',
data: {
username: $('.username').val(),
password: $('.password').val()
},
success(res) {
if (JSON.parse(res).statusCode === 1) {
location.href = "http://www.baidu.com"
} else {
alert('用户名或是密码错误')
}
}
})
})
</script>

18.登录需要查找数据库get()方法

  • 需要连接数据库
  • 查询数据库
  • 将查询的数据给前台
  • 创建form.ejs
    1,首先需要读data文件夹里面的user文件里面是否存在数据
    2.此时获得的保存下来的数据是字符串 所以需要转成对象
    3.将前端的数据与后端相应的数据进行比较看是否相等

.get((req, res, next) => { //get 是查询
// 1.需要连接数据库
// 2.查询数据库
// 3.将查询的数据给前台
// 4.创建form.ejs
fs.readFile(path.join(__dirname, '../data/user.txt'), 'utf8', (error, data) => {
// console.log(data)
const user = JSON.parse(data)
if (req.query.username === user.username && req.query.password === user.password) {
res.render('form', {
data: JSON.stringify({
res: true,
status: '登录成功',
statusCode: 1
})
})
} else {
res.render('form', {
data: JSON.stringify({
res: true,
status: '登录失败',
statusCode: 0
})
})
}
})
})


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值