MongoDB CRUD

建立模組(Creating a model)–Schemas:構造函數,定義存儲在每個文檔中的字段,及其驗證要求和默認值。

新增models資料庫,並新增一個資料為newsModel.js
載入(require)mongoose資料庫

timestamps時間戳:對像或布爾值 - 默認為 false。 如果為真,Mongoose 會將 createdAt 和 updatedAt 屬性添加到您的模式並為您管理這些屬性。

使用uuid npm uuid

MongoDB 會自動產生一組 id

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
const mongoose = require('mongoose')
//require uuid
const { v4: uuidv4 } = require('uuid')
const newsSchema = mongoose.Schema(
{
uuid: {
type: String,
default: () => uuidv4()
},
subject: {
type: String,
match: [
/^.{2,10}$/,
'Please add a valid subject 2~10',
],
required: [true, "Please enter subject"],
trim: true,
},
content: {
type: String,
match: [
/^.{4,500}$/,
'Please add a valid content 4~500',
],
required: [true, "請輸入內容"],
trim: true,
},
createdTime: {
type: String,
},
updatedTime: {
type: String,
}
}
/* {
timestamps: true
}*/
)
const News = mongoose.model('News', newsSchema);
module.exports = News;

安裝moment.js

1
npm install moment --save

router/api.js

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
const express = require('express')
//載入newsModel
const News = require('../models/newModel')
//載入時間套件
const moment = require('moment');
moment().format();


//Create
router.post('/new', async(req, res) => {
try {
/* #swagger.tags = ['News']
#swagger.description = '' */

/* #swagger.parameters['obj'] = {
in: 'body',
description: '',
required: true,
schema: { $ref: "#/definitions/AddNews" }
} */

/* #swagger.security = [{
"apiKeyAuth": []
}] */
const data = new News({
subject:req.body.subject,
image:req.body.image,
content:req.body.content,
createdTime: moment(Date.now()).format('YYYY-MM-DDTHH:mm:ss.SSS'),
updatedTime: moment(Date.now()).format('YYYY-MM-DDTHH:mm:ss.SSS'),
})
const news = await data.save();
res.status(200).json(news);

} catch (error) {
const expr = error.message;
console.log('News error.message',expr)
switch (expr) {
case 'News validation failed: subject: Please add a valid subject 2~30':
res.status(400).json({ message: 'subject 驗證失敗:subject必須2~30字符' })
break;
case 'News validation failed: subject: Please add a valid name 2~30, content: Please add a valid content 4~500':
res.status(400).json({message: '`subject`,`content`驗證失敗' })
break;
case 'News validation failed: content: Please add a valid content 4~500':
res.status(400).json({message: 'content驗證失敗:subject必須4~500字符' })
break;
default:
console.log('!!');
}
// res.status(500).json({message: error.message})
}
})
router.get('/news', async(req, res) => {
try {
const news = await News.find({});
res.status(200).json(news);
} catch (error) {
res.status(500).json({message: error.message})
}
})
router.get('/news/:id', async(req, res) =>{
try {
const {id} = req.params;
const news = await News.findById(id);
res.status(200).json(news);
} catch (error) {
res.status(500).json({message: error.message})
}
})
router.put('/news/:id', async(req, res) => {
try {
/* #swagger.tags = ['News']
#swagger.description = '' */

/* #swagger.parameters['obj'] = {
in: 'body',
description: '',
required: true,
schema: { $ref: "#/definitions/News" }
} */

/* #swagger.security = [{
"apiKeyAuth": []
}] */
const { id } = req.params;
const data = {
subject:req.body.subject,
image:req.body.image,
content:req.body.content,
updatedTime: moment(Date.now()).format('YYYY-MM-DDTHH:mm:ss.SSS'),
}
const news = await News.findByIdAndUpdate(id, data);
// we cannot find any news in database
if(!news){
return res.status(404).json({message: `cannot find any news with ID ${id}`})
}
const updatedNews = await New.findById(id);
res.status(200).json(updatedNews);

} catch (error) {
res.status(500).json({message: error.message})
}
})
router.delete('/news/:id', async(req, res) =>{
try {
const {id} = req.params;
const test = await News.findByIdAndDelete(id);
if(!test){
return res.status(404).json({message: `cannot find any news with ID ${id}`})
}
res.status(200).json(test);

} catch (error) {
res.status(500).json({message: error.message})
}
})