nodeJs项目总结

文章目录

  • 学习总结
    • mongoose
      • 指令
      • 操作
      • schema 对象
        • 将Shcema对象转化为数据模型
        • 操作数据库
          • 插入
          • 查询
          • 删除
          • 修改
          • 限制查询条数
    • 模板引擎
      • 语法
        • 模版输出
        • 条件判断
        • 循环
      • 子模版
      • 模版继承
  • 项目
    • Login
      • 主要步骤及逻辑
      • 身份认证
        • session + cookie
        • jwt

学习总结

mongoose

指令

mongodb 数据库名
mongod 命令行启动数据库命令
mongo 命令行操作数据库指令
mongoose node 操作数据库的插件

操作

连接数据库

const mongoose = require('mongoose')
// 连接数据库
mongoose.connect('mongodb://localhost/mq')
var db = mongoose.connection    // db数据库的连接对象db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {console.log('db ok')
})

schema 对象

创建一个和集合相关的Schema对象 类似表头

// var Schema = mongoose.Schema
// 获取schema对象
var userSchema = new mongoose.Schema({us: {type: String,require: true},ps: {type: String, require: true},age: Number,sex: {type: Number, default: 0}})
将Shcema对象转化为数据模型
var User = mongoose.model('users', userSchema)  // 该数据对象和集合相关联{'集合名',schema对象}
操作数据库
插入
User.insertMany({us:'mq',ps:'123',age:18})
.then((data)=>{console.log(data)console.log('插入成功')
})
.catch((err)=>{console.log('查找失败')
})
查询
// 查询
User.find({age: 17})
.then((data)=>{console.log(data)console.log('查找成功')
})
.catch((err)=>{console.log('查询失败')
})
删除

remove可以选择删除单条 或者 全部数据
single 为true时,是删除一条数据反之flase为全部,默认为flase
deleteOne顾名思义,只能删除一条数据
Model.deleteMany() 根据条件进行删除,可以看到deleteMany可传多个条件,查找符合条件的删除

// 删除
User.deleteOne()
.then((data)=>{console.log(data)console.log('删除成功')
})
.catch((err)=>{console.log('删除失败')
})
修改
User.updateOne({_id: "66548410d09271296fceba21" },{age:17})
.then((data)=>{console.log(data)console.log('修改成功')}).catch((err)=>{console.log('修改失败')})
限制查询条数

limit(Number) number值为空时代表全部查出
查询结果跳过若干条记录
skip(Number)
对数据进行排序
sort() number值为空时代表全部查出
1 为升序 -1 为降序

skip()与limit()的前后顺序没有要求,不管怎么放置他们执行的顺序都是先sort()后skip()最后limit()

模板引擎

下载:npm install art-template
引入:const template = require(‘art-template’)
用法:const html = template(‘模版路径’,数据);

语法

模版输出

● 标准语法:{{ }}
● 原始语法:<%= %>
注:如果数据携带HTML标签,默认模版引擎不会解析标签
解决方法:{{@ }} 原文输出

条件判断

● 标准语法
{{if 条件}} . . . {{/if}}
{{if v1}} . . . {{else if v2}} . . . {{/if}}
● 原始语法
<% if(value){%> . . . <%}> %>
<% if(v1){%> . . . <%} else if (v2){%> . . . <%}> %>

循环

● 标准语法:{{each 数据}}{{/each}}
{{each target}}
{{KaTeX parse error: Expected 'EOF', got '}' at position 6: index}̲} {{value}}
{{/each}}
● 原始语法:<% for(){ %> <% } %>

子模版

将网站公共区块(头部,底部)抽离到单独的文件中
● 标准语法:{{include ‘模版’}}
● 原始语法:<% include ‘模版’ %>

模版继承

可以将网站HTML骨架抽离到单独的文件中,其他页面模版也可以继承骨架文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>{{block 'head'}}{{/block}}
</head>
<body>{{block 'content'}}{{/block}}
</body>
</html>
index.art   首页模版
{{extend './layout.art'}}
{{block 'head'}}<link rel="stylesheet" href="custom.css">{{/block}}
{{block 'content'}}<p>This is just an awesome page.</p>{{/block}}

项目

Login

主要步骤及逻辑

1.注册登录 mongod
2.验证码逻辑接口实现

  • a.验证用户名存在
  • b.
    1)获取邮箱验证码接口 a)发送文档 b)邮箱和验证码保存到内存中
    2)五分钟之内不能重复发送
    3)五分钟之内

3.apidoc 自动生成api接口文档

身份认证

http请求 无状态
1.登录的时候,发布一个加密字符串(用户相关信息)给前端
2.调用其它接口,将加密字符串 作为参数传递给服务器

session + cookie

cokie-parser 解析
express-session

const cookieParse = require('cookie-parser')
const session = require('express-session')app.use(session({secret:'dfgdtwuaioehto',   // 为了安全性的考虑设置secret属性cookie:{maxAge: 60*1000*60*24*7} , // 设置过期时间resave: true,    // 即使session没有被修改,也保存session值默认为truesaveUninitialized:false,   // 无论有没有session  cookie,每次请求都设置个session  cookie,默认给个标示为  connect.sid
}))
app.use('/user',(req,res,next)=>{console.log(req.body)console.log(req.session)next()
},userRouter)
jwt

用户登录 服务器端产生一个token(加密字符串)发送给前端
前端将token保存
前端发起数据请求的时候携带token
服务端验证token是否合法,如果合法继续操作 不合法终止操作
token的使用场景 无状态请求 保持用户登录的状态 第三方登录(token+auth2.0)
非对称加密
通过私钥产生token 通过公钥解密token

const jwt = require('jsonwebtoken')
const scrict = 'sagdfgiohwentroiabcvh'
// 产生token
function creatToken(palyload) {palyload.ctime = Date.now()  // 创建时间return jwt.sign(palyload, scrict)
}// 验证token
function checkToken(token) {return new Promise((resovle, reject) => {jwt.verify(token, scrict, (err, data) => {if (err) { reject('token 验证失败') }resovle(data)})})
}
module.exports = {creatToken,checkToken
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解 IPv4 和 IPv6 之间的区别?

在广阔的互联网环境中&#xff0c;设备之间的通信依赖于一组独特的协议来促进连接。在这些协议中&#xff0c;IPv4&#xff08;互联网协议第4版&#xff09;和IPv6&#xff08;互联网协议第6版&#xff09;是数字基础设施的支柱&#xff0c;能够跨网络传输数据。但是&#xff0…

基于WIN2016搭建MS2016 ALWAYS ON域控故障转移群集

基于WIN2016搭建MS2016 ALWAYS ON域控故障转移群集 一、前言1、Always On简介2、AD DC域控简介 二、部署实施1、部署环境简介2、搭建流程简介3、域控服务器安装及群集节点加域3.1、安装域控&#xff0c;安装同时会安装DNS系统3.2、执行安装&#xff0c;完成后重启服务器3.3、将…

前端需不需要控制并发请求?浏览器自带并发控制?

不知道为什么&#xff0c;最近大数据给我推荐了几篇前端做控制并发的文章&#xff0c;技术实现是没任何问题&#xff0c;使用到的技术核心也不错&#xff0c;就是应用的地方就有点问题了。 浏览器 HTTP 请求 pending 打开浏览器&#xff0c;network 可以看每个请求的状态&…

如何让 大模型/深度学习 更加聪明(切实有效的8个思考角度)

要让大模型更加聪明&#xff0c;可以采取以下方法&#xff1a; 增加数据量&#xff1a;大模型需要足够的数据来学习和理解复杂的问题。通过增加训练数据的数量&#xff0c;可以帮助模型更全面地学习和推理。 提高模型的复杂度&#xff1a;大模型往往有更多的层和参数&#xff…

「vue同一个组件,不同路由切换时界面没有更新问题」

问题&#xff1a;vue项目中不同路由切换时&#xff0c;因为引用的同一个组件&#xff0c;界面数据没有更新 一、解决方法 添加key&#xff0c;具体原理可参考vue中的diff算法 <router-view :key"$route.fullPath"></router-view>

【代码随想录算法训练营第37期 第二十八天 | LeetCode93.复原IP地址、78.子集、90.子集II】

代码随想录算法训练营第37期 第二十八天 | LeetCode93.复原IP地址、78.子集、90.子集II 一、93.复原IP地址 解题代码C&#xff1a; class Solution { private:vector<string> result;void backtracking(string& s, int startIndex, int pointNum){if(pointNum 3){…

AI大数据处理与分析实战--体育问卷分析

AI大数据处理与分析实战–体育问卷分析 前言&#xff1a;前一段时间接了一个需求&#xff0c;使用AI进行数据分析与处理&#xff0c;遂整理了一下大致过程和大致简要结果&#xff08;更详细就不方便放了&#xff09;。 文章目录 AI大数据处理与分析实战--体育问卷分析一、数据…

【电子通识】什么是电力电子

什么是电力电子 在日常生活中&#xff0c;电能变换的需求无处不在。比如给手机充电&#xff0c;充电器从插座220V交流电取电并转换为手机电池所需的5V或者其他幅度的直流电输送给手机&#xff0c;这就完成了最简单的AC-DC电能转换。除此之外&#xff0c;还有空调、电视、新能源…

【C++】入门(二):引用、内联、auto

书接上回&#xff1a;【C】入门&#xff08;一&#xff09;&#xff1a;命名空间、缺省参数、函数重载 文章目录 六、引用引用的概念引用的使用场景1. 引用做参数作用1&#xff1a;输出型参数作用2&#xff1a;对象比较大&#xff0c;减少拷贝&#xff0c;提高效率 2. 引用作为…

MySQL—约束—外键约束(基础)

一、引言 概念&#xff1a;外键用来让两张表的数据之间建立连接&#xff0c;从而保证数据的一致性和完整性。 举个例子&#xff1a; 提示说明&#xff1a;&#xff08;有两张表&#xff09; &#xff08;1&#xff09;员工表&#xff1a;emp id&#xff1a;主键、姓名、年龄、…

git 提交

当你不小心在master上改了代码&#xff0c;并且add&#xff0c; commit 之后&#xff0c;想push&#xff0c;发现根本push不了&#xff08;本来也不能直接将master代码push到远端&#xff09;&#xff0c;而且每次pull远程master的时候都要和本地的master进行merge &#xff0c…

机器人系统ros2-开发学习实践16-RViz 用户指南

RViz 是 ROS&#xff08;Robot Operating System&#xff09;中的一个强大的 3D 可视化工具&#xff0c;用于可视化机器人模型、传感器数据、路径规划等。以下是RViz用户指南&#xff0c;帮助你了解如何使用RViz来进行机器人开发和调试。 启动可视化工具 ros2 run rviz2 rviz2…

css-Ant-Menu 导航菜单更改为左侧列表行选中

1.Ant-Menu导航菜单 导航菜单是一个网站的灵魂&#xff0c;用户依赖导航在各个页面中进行跳转。一般分为顶部导航和侧边导航&#xff0c;顶部导航提供全局性的类目和功能&#xff0c;侧边导航提供多级结构来收纳和排列网站架构。 2.具体代码 html <!-- 左侧切换 --><…

15、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、plot()函数默认格式画图 代码: x=0:0.1:20;%绘图默认格式 y=sin(x); plot(x,y) 2、X轴和Y轴显示范围/axis()函数 代码: x=0:0.1:20;%绘图默认格式 y=sin(x); plot(x,y) axis([0 21 -1.1 1.1])%设置范围 3、网格显示/grid on函数 代码: x=0:0.1:20;%绘图默认格式 …

CXL (1)

为什么有CXL CXL说到底 是为了打破内存墙而生的 CXL全称是Compute Express Link&#xff0c; 可以用来连接CPU&#xff0c;以及其他任何计算单元&#xff0c;比如GPU。 CXL和PCIe跑在一样的physical layer上&#xff0c;与PCIe不一样的是&#xff0c;CXL允许CPU和连接的设备共…

Python | R 潜在混合模型

&#x1f4dc;用例 &#x1f4dc;Python | MATLAB | R 心理认知数学图形模型推断 | &#x1f4dc;信用卡消费高斯混合模型 | &#x1f4dc;必修课学业成绩分布异常背景混合模型潜在类别分析 ✒️潜在混合模型 本质上&#xff0c;混合模型&#xff08;或混合分布&#xff09;…

(文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略

参考文献&#xff1a; [1]潘虹锦,高红均,杨艳红,等.基于主从博弈的售电商多元零售套餐设计与多级市场购电策略[J].中国电机工程学报,2022,42(13):4785-4800. 1.摘要 随着电力市场改革的发展&#xff0c;如何制定吸引用户选择的多类型零售套餐成为提升售电商利润的研究重点。为…

wms中对屏幕进行修改wm size设置屏幕宽高原理剖析

背景&#xff1a; 上面是正常屏幕1440x2960的屏幕大小&#xff0c;如果对display进行相关的修改&#xff0c;可以使用如下命令&#xff1a; adb shell wm size 1080x1920 得出如下的画面 明显看到差异就是屏幕上下有黑边了&#xff0c;那么下面就来调研这个wm size是怎么做的…

matlab中添加子文件夹路径以及结构体

添加子文件夹路径举例 addpath(./functions);结构体使用举例&#xff1a; 首先对结构体初始化&#xff0c;貌似matlab中不需要提前声明。 para para_init();function [para] para_init() %Construct a struct of the initial values for all the parameters % [values] …

(10)svelte 教程:Slots

&#xff08;10&#xff09;svelte 教程&#xff1a;Slots 什么是 Slots Slots 是 Svelte 框架中的一种特性&#xff0c;用于在组件中定义插槽&#xff0c;以便父组件可以向子组件传递任意的内容。这种机制使得组件更具灵活性和可复用性&#xff0c;因为你可以在组件内部插入…