三十九、node(客户端,服务端数据渲染,设计模式mvc)

前端代理解决跨域!!!

1.安装http-proxy-middleware模块
安装命令:
cnpm i http-proxy-middleware
npm i http-proxy-middleware -D
yarn add http-proxy-middleware

注意:安装过程中如果出现报错,或是安装成功后启动服务器出现红圈圈中错误可删掉node_modules目录重新安装node模块(命令:cnpm i)
在这里插入图片描述
在这里插入图片描述

2.使用 在app.js 文件中配置(引入 使用)

此处是将网页中出现跨域要请求http://kg.zhaodashen.cn的地方换成/api即前端代理请求数据。
在这里插入图片描述
注意: 导入模块 会因版本问题 报错, 新语法 百度

解决项目中每次调试代码都要重启服务器问题

安装nodemon模块,手动重启修改为自动重启

1、安装nodemon模块

nodemon模块安装命令

cnpm i nodemon -g
或
yarn global add nodemon

2、修改package.json
在这里插入图片描述

客户端,服务端渲染简介

客户端渲染 BSR(browser side render)

没数据:先在浏览器显示HTML,再发送异步请求ajax,最后通过js操作DOM显示

服务端渲染 SSR(server side render)

 有数据:先将数据库数据和页面HTML代码拼接、组成完整的HTML,再给用户

区别
表面:服务端数据渲染ssr(浏览器中查看源代码-数据在)、客户端数据渲染bsr(浏览器中查看源代码-数据 不在)

核心:服务端渲染有利于SEO优化,也就是百度搜你的网站靠前

留心:实战工作,根据产品定

服务端渲染 SSR!

一、在路由获取数据库数据

 步骤1:创建goods模型文件
 步骤2:封装create和list方法并且导出
 步骤3:路由调用方法即可(留心:旧知识点async、await

二、方法1-replace替换数据 (不推荐

HTML

<h1>^_^</h1>
<h1>!_!</h1>//静态页面上标记出来

index.js路由

router.get('/', (req, res) => {
    let html = fs.readFileSync('./views/index.html', 'utf-8')
    let data1 = 111 // 来源于数据库
    let data2 = 222 // 来源于数据库
    html = html.replace('^_^', data1)//
    html = html.replace('!_!', data2)//将页面上打的标记替换成数据库数据
    res.send(html)  
    // res.send('this is index index')
})

发现:上述代码麻烦,难维护(1-静态文件需要标记符号、2-每次替换麻烦

解决:模板引擎 原理:基于replace封装 目的:更方便加载文件、和替换数据
三、方法2-模板引擎(推荐

在express中整合art模板引擎

步骤1:安装 cnpm i art-template express-art-template

步骤2:配置 留心:修改app.js 注意位置

 app.use('/public', express.static('public')) 	      //允许静态资源被外部访问
 app.set('views', path.join(__dirname, 'views'))       //设置视图目录
 app.engine('html', require('express-art-template'))   //声明模板引擎和模板后缀
 app.set('view engine', 'html')						  //声明render渲染不需要写后缀

在这里插入图片描述
步骤3:测试
语法:以前 res.end() res.send() 有模板引擎之后 直接用res.render(文件名,传递的数据)
留心:render会自定将替换后的数据,响应到浏览器
在这里插入图片描述
在这里插入图片描述

■接口相关!!!

什么是接口?
就是一个文件,主要**响应JSON数据(操作方便,体积小)**或XML数据

{
  status: 1/0,
  msg: '提示信息'
}
-----
<xml>
  <status>1/0</status>
  <msg>提示信息</msg>
  ...
</xml>

只要响应json数据所有语言都可以操作,例如ios/Android等
推荐:

{
    meta: {
        msg: 提示信息,
        status: 状态码(200/201/301/302/400/401/403/404/500},
    data: 数据
}

.js

.php

.json都行 只要响应json数据

接口的作用:
数据角度:让静态页面数据动态化

功能角度:短信接口、幽默笑话接口、天气接口、股票接口等

接口开发规范(Restful API)

接口可能是一个人开发,也可能多人开发,如何保证大家的编写规范一样

a 商品模块 /goods/getIndex get
b 订单模块 /order/index post
c 用户模块 /user

发现:上面这种case项目没有统一开发规则
问题:后期维护麻烦
回答:通过目前比较火的RESTful API思想/架构

  • 说明:RESTful是目前最流行的一种互联网软件架构(思想)
  • 作用:声明/提供了接口设计原则和约束条件(一个范围)
    • 相关:

后端将资源发布到URL上->前端通过URL访问资源->并通过HTTP动词表示要对资源进行的操作
后端定义接口->前端请求接口->HTTP动词表名操作目的(get获取post新建put更新等)

  • 举栗

列表页:访问 - /模块名 (get)
详情页:访问 - /模块名/编号 (get)
添加页:访问 - /模块名/create (get)
处 理:访问 - /模块名 (post)
修改页:访问 - /模块名/编号/edit(get)
**处 理:访问 - /模块名/编号 (put) **
删 除:访问 - /模块名/编号 (delete)

HTTP动词:get、post、put、delete

  • 好处:统一开发规范,便与团队协作开发

明确需求

发现:上面SSR操作数据代码存在冗余

1 指连接数据库缺少封装
2 接口响应的格式缺少封装
3 路由有大量模型操作 后期路由越来越来   从app.js提取到routes目录失去意义
等

明确:项目越大,如果没有统一开发规范(例如命名规范等)后期开发会越来越难维护

解决:通过行业成熟的 开发模式/架构模式/开发思想 MVC、RMVC

2、MVC介绍

什么是设计模式:查看

设计模式:前辈的开发经验总结的开发思想

思想好处:1-便于维护,2-增强代码重用性,减少代码冗余等


什么是MVC / MVC模式 / MVC思想 / MVC架构:是软件中常见的一种开发架构模式(概括开发规则)

M model 让你搞一个目录单独存放模型文件 一般叫 model

V view 让你搞一个目录单独存放视图(静态文件)文件 一般叫views (注:接口开发忽略)

C controller 让你搞一个目录专门写逻辑代码 而不是 全部放到 router 目录中

3、按照MVC架构模式初始化目录(CV

a 初始化创建接口项目

a 创建jxshop2api项目通过express脚手架工具 【express jxshop2api】
b 进入目录、安装模块【cd jxshop2api 接着 yarn install】

b 封装全局函数&配置文件

创建文件1:common/config.json

{
	"db_config":{
		"host" : "localhost",
		"port" : 27017,
		"dbname" : "jxshop"
	}
}

yarn add mongoose 或者 cnpm i mongoose

创建文件2:common/db.js

// 导入模块
const mongoose = require('mongoose');
// 导入配置文件
const configObj = require(process.cwd() + "/common/config.json").db_config

// 连接数据库
const db = mongoose.createConnection(`mongodb://${configObj.host}:${configObj.port}/${configObj.dbname}`, {useNewUrlParser: true, useUnifiedTopology: true}, (err)=>{
    if(err){
        console.log('---------------------------------------')
        console.log('数据库连接失败:', configObj)
        console.log('---------------------------------------')
        return;
    }
    console.log('数据库连接成功');
})

// 声明全局变量
global.db = db

创建文件3:common/utils.js

// http协议状态码(背 明晚抽查 说不出来30遍)
// 2XX  成功
// 		200-成功    正常返回     (服务器已成功处理了请求)     
// 		201-创建    成功创建数据 (表示服务器执行成功,并且创建了新的资源)     
// 		202-已接受              (服务器接受请求,但未处理)
// 3XX  重定向(服务器返回信息告知浏览器如何做后续操作才能成功处理请求)
//      301-永久(新网站)
//      302-临时(站内跳转)
//      304-浏览器缓存(请求成功检测为修改数据来源于浏览器)
// 4XX  客户端错误(客户端原因,妨碍了服务器的处理)
//      400-前端请求失败,方式参数不对
//      401-未通过 HTTP 认证的认证信息(场景:网页登录失败)
//      403-禁止访问(码云私有仓库)
//      404-文件不存在
//      405-请求方法有误 
// 5XX  服务端错误
//		500-服务器端在执行请求时发生了错误
//		503-服务器过载,无法处理请求
// -------------------------------
/**
 * 接口响应
 * @param {Object} res      响应对象
 * @param {Number} code     状态码
 * @param {String} message  提示信息
 * @param {mixed}  data     响应数据
 */
global.sendJson = (res, code, message, data = null) => {
    res.json({
        "meta" : {
            "state" : code,
            "msg" 	: message
        }, 
        "data" : data
    });
}

修改app.js导入

require(process.cwd() + "/common/db.js")
require(process.cwd() + "/common/utils.js")

在这里插入图片描述

c 创建用户模型(M

models/users.js

const model = db.model('users',{
	uname:{type:String, default:"匿名者"},
	pwd:{type: String},
	sex:{type:String, default: '女'},
	age:{type:Number, default: 18}
})

// 封装方法


// 导出
module.exports = {
    
}

e 创建controller控制器目录(C

作用:将routes中的逻辑代码 放到 controller目录下

好处:routes中的会变得干净 一看就知道这里面有几个路由

规则

之前 服务端渲染 路由直接调用模型

现在 客户端渲染 写接口 路由调用 -> 控制器controller -> 模型model

​ 将路由里面的代码封装到控制器

1 先定义路由,响应 hello (留心:不要路由直接返回 而是路由调用控制器 控制器返回

2 修改模块,路由调用控制器、控制器调用模型 、返回json数据

4、用户列表接口

在这里插入图片描述

5、用户登录接口

在这里插入图片描述

6、用户注册接口

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值