80 phút
Database Integration với MongoDB
Mongoose ODM
Kết nối MongoDB
const mongoose = require('mongoose');
const connectDB = async () => {
try {
const conn = await mongoose.connect(process.env.MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
console.log(`MongoDB Connected: ${conn.connection.host}`);
} catch (error) {
console.error('Database connection error:', error);
process.exit(1);
}
};
module.exports = connectDB;
Tạo Schema và Model
const userSchema = new mongoose.Schema({
name: {
type: String,
required: [true, 'Please add a name'],
trim: true,
maxlength: [50, 'Name cannot be more than 50 characters']
},
email: {
type: String,
required: [true, 'Please add an email'],
unique: true,
lowercase: true,
match: [
/^w+([.-]?w+)*@w+([.-]?w+)*(.w{2,3})+$/,
'Please add a valid email'
]
},
password: {
type: String,
required: [true, 'Please add a password'],
minlength: 6,
select: false
},
role: {
type: String,
enum: ['user', 'admin'],
default: 'user'
}
}, {
timestamps: true
});
// Instance method
userSchema.methods.getSignedJwtToken = function() {
return jwt.sign({ id: this._id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRE
});
};
module.exports = mongoose.model('User', userSchema);
CRUD Operations với Mongoose
Tạo và Đọc
// Create user
const createUser = asyncHandler(async (req, res) => {
const user = await User.create(req.body);
res.status(201).json({
success: true,
data: user
});
});
// Get all users với filtering, sorting, pagination
const getUsers = asyncHandler(async (req, res) => {
// Copy req.query
const reqQuery = { ...req.query };
// Fields to exclude
const removeFields = ['select', 'sort', 'page', 'limit'];
removeFields.forEach(param => delete reqQuery[param]);
// Create query string
let queryStr = JSON.stringify(reqQuery);
queryStr = queryStr.replace(/(gt|gte|lt|lte|in)/g, match => `$${match}`);
// Finding resource
let query = User.find(JSON.parse(queryStr));
// Select fields
if (req.query.select) {
const fields = req.query.select.split(',').join(' ');
query = query.select(fields);
}
// Sort
if (req.query.sort) {
const sortBy = req.query.sort.split(',').join(' ');
query = query.sort(sortBy);
} else {
query = query.sort('-createdAt');
}
// Pagination
const page = parseInt(req.query.page, 10) || 1;
const limit = parseInt(req.query.limit, 10) || 25;
const startIndex = (page - 1) * limit;
const endIndex = page * limit;
const total = await User.countDocuments();
query = query.skip(startIndex).limit(limit);
// Executing query
const users = await query;
// Pagination result
const pagination = {};
if (endIndex < total) {
pagination.next = { page: page + 1, limit };
}
if (startIndex > 0) {
pagination.prev = { page: page - 1, limit };
}
res.status(200).json({
success: true,
count: users.length,
pagination,
data: users
});
});
Bài tập thực hành
Hãy tạo CRUD API với MongoDB!