一些工具的使用

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 })
})

后续学到再补充~

相关推荐
Dxy12393102165 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷5 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
椒哥7 小时前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github
kyriewen8 小时前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员
OpsEye9 小时前
企业大模型压测,需要重点关注哪些指标?
javascript·ai编程
Hone9 小时前
我把「自动发文章到掘金」做成了一个 Agent 技能:juejin-skills
node.js·ai编程·前端工程化
像我这样帅的人丶你还10 小时前
我html生成的doc文档为何在手机文档显示不了图片?
前端·javascript
todoitbo10 小时前
MongoDB迁移之后,Spring Data 和 Hibernate 各自接哪类请求
大数据·数据库·mongodb·spring·hibernate·金仓数据库
栉甜13 小时前
Vue2学习内容(上)
前端·javascript·vue.js·学习
shmily麻瓜小菜鸡15 小时前
TypeScript 知识点补充(第三部分:工程化与高级类型)
前端·javascript·typescript