一些工具的使用

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

后续学到再补充~

相关推荐
晴殇i5 小时前
DOM嵌套关系全解析:前端必备的4大判断方法与性能优化实战
前端·javascript·面试
字节拾光5 小时前
console.log 打印 DOM 后内容变了?核心原因是 “引用” 而非 “快照”
javascript
Asort5 小时前
React函数组件深度解析:从基础到最佳实践
前端·javascript·react.js
Justineo6 小时前
TemPad Dev:设计与实现
前端·javascript·css
AAA简单玩转程序设计6 小时前
救命!HTML按钮点了没反应?3分钟学会给网页“装脑子”
javascript·html
神秘的猪头6 小时前
浏览器是如何渲染 HTML/CSS/JS 页面的?——从代码到像素的完整流程
前端·javascript
啷咯哩咯啷6 小时前
el-table-v2 实现自适应列宽
前端·javascript·vue.js
3秒一个大6 小时前
JavaScript 中 var、let 和 const 的区别与应用
javascript
inx1776 小时前
微信小程序开发实战:从结构到数据绑定的完整实现
javascript·微信小程序