一些工具的使用

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

后续学到再补充~

相关推荐
大橙子额33 分钟前
【解决报错】Cannot assign to read only property ‘exports‘ of object ‘#<Object>‘
前端·javascript·vue.js
WooaiJava2 小时前
AI 智能助手项目面试技术要点总结(前端部分)
javascript·大模型·html5
Never_Satisfied2 小时前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌412 小时前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
WeiXiao_Hyy3 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
xjt_09014 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农4 小时前
Vue 2.3
前端·javascript·vue.js
辰风沐阳4 小时前
JavaScript 的宏任务和微任务
javascript
冰暮流星5 小时前
javascript之二重循环练习
开发语言·javascript·数据库
Mr Xu_5 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js