一些工具的使用

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

后续学到再补充~

相关推荐
king王一帅4 小时前
Incremark Solid 版本上线:Vue/React/Svelte/Solid 四大框架,统一体验
前端·javascript·人工智能
Nan_Shu_61410 小时前
学习: Threejs (1)
javascript·学习
Van_Moonlight10 小时前
RN for OpenHarmony 实战 TodoList 项目:加载状态 Loading
javascript·开源·harmonyos
qq_4061761411 小时前
关于JavaScript中的filter方法
开发语言·前端·javascript·ajax·原型模式
@@小旭12 小时前
实现头部Sticky 粘性布局,并且点击菜单滑动到相应位置
前端·javascript·css
Van_captain12 小时前
rn_for_openharmony常用组件_Divider分割线
javascript·开源·harmonyos
Yanni4Night13 小时前
Parcel 作者:如何用静态Hermes把JavaScript编译成C语言
前端·javascript·rust
天意pt13 小时前
Blog-SSR 系统操作手册(v1.0.0)
前端·vue.js·redis·mysql·docker·node.js·express
遇见~未来13 小时前
JavaScript构造函数与Class终极指南
开发语言·javascript·原型模式
毕设源码-邱学长14 小时前
【开题答辩全过程】以 基于VUE的打车系统的设计与实现为例,包含答辩的问题和答案
前端·javascript·vue.js