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 })
})
后续学到再补充~