一些工具的使用

dotenv

在 package.json 的同级目录下创建 .env 文件

env 复制代码
# index.js
PORT=5001
... ...

通过 process.env.xxx 读取:

js 复制代码
// index.js
import dotenv from 'dotenv'
dotenv.config()
const PORT = process.env.PORT

也可以直接导入 dotenv/config

js 复制代码
// index.js
import 'dotenv/config'
const PORT = process.env.PORT

Mongoose

验证是否连接成功:

js 复制代码
// db.js
import mongoose from 'mongoose'

export const connectDB = async () => {
  try {
    const conn = await mongoose.connect(process.env.MONGODB_URL)
    console.log(`MongoDB connected: ${conn.connection.host}`);
  } catch (error) {
    console.log(`MongoDB connected error: ${error}`);
  }
}
js 复制代码
// index.js
app.listen(PORT, () => {
  console.log('server is running on port:' + PORT);
  connectDB()
})

输出 MongoDB connected... 代表连接成功


定义模式与模型

js 复制代码
import mongoose from 'mongoose'

const userSchema = new mongoose.Schema(
  {
    email: {
      type: String,
      required: true,
      unique: true
    },
    ... ...
  }, 
  { timestamps: true }
)

const User = mongoose.model('User', userSchema)

export default User

js 复制代码
// 增加一条
const newUser = await User.create({
  email,
  fullName,
  password: hashPassword
})
// 增加多条
// const users = await User.create([{...}, {...}])
// save方式
// const user = new User({...}).save()


js 复制代码
const upadteUser = await User.findByIdAndUpdate(userId, { profilePic: result.secure_url }, { new: true })

配置项:

  • new: true 返回修改后的数据

可搭配select一起使用

js 复制代码
// 查询满足条件的第一条文档
const user = await User.findOne({ email })

// 通过id查询
const user = await User.findById(payload.userId).select("-password")
const user = await User.findById(payload.userId).select("fullName email profile")

// 查询多个
const filtersUsers = await User.find({ _id: { $ne: loginUserId } })

比较操作符:

  • $ne(≠,not equal)
  • $eq(=,equal)
  • $gt(>,greater than)
  • $gte(≥,greater than or equal)
  • $lt(<,less than)
  • $lte(≤,less than or equal)
  • $in(in array)
  • $nin(not in array)

逻辑类

  • $or(或)
  • $and(与)
  • $not(非)
  • $nor(都不)

bcrypt

将密码转为哈希值后再存入数据库

js 复制代码
import bcrypt from 'bcryptjs
// 注册时
const hashPassword = await bcrypt.hash(password, 12)

登录时,从数据库中取出哈希密码值与用户输入的密码对比是否一致

js 复制代码
const isOk = await bcrypt.compare(password, user.password)

jsonwentoken

签发

js 复制代码
import jwt from 'jsonwebtoken'
const token = jwt.sign({ userId }, process.env.JWT_SECRET, { expiresIn: '7d' })

验证

js 复制代码
// 返回的payload就是上面jwt.sign传进去的{ userId }
const payload = jwt.verify(token, process.env.JWT_SECRET)

cookieParser

在响应头中设置cookie

js 复制代码
res.cookie('jwt', token, {
  maxAge: 7 * 24 * 60 * 60 * 1000,
  httpOnly: true,
  sameSite: 'strict',
  secure: process.env.NODE_ENV !== 'development'
})

从请求头中读取cookie

js 复制代码
// 注意!是cookies.jwt,不是cookie.jwt
const token = req.cookies.jwt

cloudinary

配置

js 复制代码
import { v2 as cloudinary } from 'cloudinary'

cloudinary.config({ 
  cloud_name: process.env.CLOUTINARY_CLOUD_NAME,
  api_key: process.env.CLOUTINARY_API_KEY,
  api_secret: process.env.CLOUTINARY_API_SECRET
})

export default cloudinary

上传

js 复制代码
cloudinary.uploader.upload(profilePic, async (err, result) => {
  if(err)  return res.status(500).json({ message: 'cloudinary上传profilePic失败' })
  // 返回更新后的数据
  await User.findByIdAndUpdate(userId, { profilePic: result.secure_url }, { new: true })
})

后续学到再补充~

相关推荐
m0_6470579610 分钟前
uniapp使用rich-text流式 Markdown 换行问题与解决方案
前端·javascript·uni-app
摘星编程30 分钟前
OpenHarmony环境下React Native:Loading全屏加载遮罩
javascript·react native·react.js
Amumu121381 小时前
Vue Router 和 常用组件库
前端·javascript·vue.js
·云扬·1 小时前
MongoDB高可用方案详解:副本集与分片集群
数据库·mongodb
£漫步 云端彡1 小时前
Golang学习历程【第八篇 指针(pointer)】
javascript·学习·golang
极客小云1 小时前
【基于AI的自动商品试用系统:不仅仅是虚拟试衣!】
javascript·python·django·flask·github·pyqt·fastapi
一位搞嵌入式的 genius1 小时前
深入理解浏览器中的 JavaScript:BOM、DOM、网络与性能优化
前端·javascript·网络·性能优化
David凉宸1 小时前
Vue 3生态系统深度解析与最佳实践
前端·javascript·vue.js
Highcharts.js1 小时前
用 Highcharts如何创建一个音频图表
javascript·信息可视化·音视频·highcharts·音频图表
全栈小51 小时前
【前端】win11操作系统安装完最新版本的NodeJs运行npm install报错,提示在此系统上禁止运行脚本
前端·npm·node.js