-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
135 lines (112 loc) · 3.75 KB
/
Copy pathindex.js
File metadata and controls
135 lines (112 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
const express = require('express');
const mongoose = require('mongoose');
// Create Express app
const app = express();
// Set the port
const PORT = 5000;
// CORS middleware - Cho phép frontend truy cập API
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
if (req.method === 'OPTIONS') {
res.sendStatus(200);
} else {
next();
}
});
app.use(express.json()); // Cho phép đọc JSON từ request body
// MongoDB Schema
const todoSchema = new mongoose.Schema({
text: {
type: String,
required: true
},
completed: {
type: Boolean,
default: false
}
}, {
timestamps: true // Tự động thêm createdAt và updatedAt
});
const Todo = mongoose.model('Todo', todoSchema);
// Kết nối MongoDB
mongoose.connect('mongodb+srv://AndrewDoan01:Doanquocan%402005@cluster0.xqxe4o1.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log('✅ Kết nối MongoDB thành công'))
.catch(err => console.error('❌ Lỗi kết nối MongoDB:', err));
// Define a route
app.get('/', (req, res) => {
res.send('<h1>Hello World!</h1><p>This is a basic Express.js server.</p>');
});
// GET - Lấy danh sách todos từ MongoDB
app.get('/todos', async (req, res) => {
try {
const todos = await Todo.find();
res.json(todos);
} catch (error) {
res.status(500).json({ error: 'Lỗi khi lấy danh sách todos' });
}
});
// POST - Thêm một todo mới vào MongoDB
app.post('/todos', async (req, res) => {
try {
const { text, completed } = req.body;
if (!text) {
return res.status(400).json({ error: 'Todo text is required' });
}
const newTodo = new Todo({
text,
completed: completed || false
});
const savedTodo = await newTodo.save();
res.status(201).json(savedTodo);
} catch (error) {
res.status(500).json({ error: 'Lỗi khi tạo todo mới' });
}
});
// PUT - Cập nhật một todo trong MongoDB
app.put('/todos/:id', async (req, res) => {
try {
const { id } = req.params;
const { text, completed } = req.body;
// Kiểm tra ID có đúng format ObjectId không
if (!mongoose.Types.ObjectId.isValid(id)) {
return res.status(400).json({ error: 'Invalid todo ID format' });
}
const updatedTodo = await Todo.findByIdAndUpdate(
id,
{ text, completed },
{ new: true, runValidators: true }
);
if (!updatedTodo) {
return res.status(404).json({ error: 'Todo not found' });
}
res.json(updatedTodo);
} catch (error) {
res.status(500).json({ error: 'Lỗi khi cập nhật todo' });
}
});
// DELETE - Xóa một todo từ MongoDB
app.delete('/todos/:id', async (req, res) => {
try {
const { id } = req.params;
// Kiểm tra ID có đúng format ObjectId không
if (!mongoose.Types.ObjectId.isValid(id)) {
return res.status(400).json({ error: 'Invalid todo ID format' });
}
const deletedTodo = await Todo.findByIdAndDelete(id);
if (!deletedTodo) {
return res.status(404).json({ error: 'Todo not found' });
}
res.status(204).send();
} catch (error) {
res.status(500).json({ error: 'Lỗi khi xóa todo' });
}
});
// Start the server
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});