使用 Node JS 在猫鼬中存储多个文本的理想方法?
Posted
技术标签:
【中文标题】使用 Node JS 在猫鼬中存储多个文本的理想方法?【英文标题】:Ideal way to store multiple texts in mongoose with Node JS? 【发布时间】:2020-05-31 09:52:12 【问题描述】:我一直在为将在不同页面上显示的文本构建一个 mongoose 模式,并且它具有用于更新文本的 POST 数据的端点。
例如,我想存储将在“关于”页面和“联系”页面中显示/更新的短信
设计文本模型的首选方式是什么?
1) 将所有消息存储在一个数据对象中的模型
在前端,父组件使用 Texts.findOne() 获取所有文本消息,并细流到需要它的页面const textsSchema = new Schema(
aboutMessage1:
type: String,
required: true
,
aboutMessage2:
type: String,
required: true
,
contactMessage1:
type: String
,
contactMessage2:
type: String
,
timestamps: true
);
2) 包含每条消息的模型——因此它将有多个对象
在前端,每个页面使用 Text.findById(textId) 来检索每条消息const textSchema = new Schema(
// Example: name = contactMessage
name:
type: String
,
message:
type: String
,
timestamps: true
);
3) 包含每个页面文本的多个模型
类似于 1) 方法,使用 Texts.findOne() 获取文本,但在每个页面中执行const aboutTextsSchema = new Schema(
message1:
type: String,
required: true
,
message2:
type: String,
required: true
,
,
timestamps: true
);
const contactTextsSchema = new Schema(
message1:
type: String,
,
message2:
type: String,
,
,
timestamps: true
);
【问题讨论】:
【参考方案1】:最有希望的选择是第二种。因为第一个和第三个选项是静态的,如果将来需要向现有页面添加新页面或新消息,则需要更改 mongoose 模型和 API 部署。
但我认为,与其创建文本架构,不如为您的场景创建页面架构。
在这里我将消息嵌入到页面架构中。
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const pageSchema = new Schema(
page:
type: String
,
messages: [
new Schema(
name:
type: String
,
message:
type: String
)
]
,
timestamps: true
);
module.exports = mongoose.model("Page", pageSchema);
现在我们可以使用这个帖子路由来创建一个页面:
router.post("/pages", async (req, res) =>
const result = await Text.create(req.body);
res.send(result);
);
我们可以使用以前的发布路线创建一个页面及其消息。
请求正文:
"_id": "5e4937e9e2454a2c0c162890",
"page": "About",
"messages": [
"_id": "5e4937e9e2454a2c0c162892",
"name": "Abou1",
"message": "About1 message..."
,
"_id": "5e4937e9e2454a2c0c162891",
"name": "Abou2",
"message": "About2 message..."
],
"createdAt": "2020-02-16T12:39:05.154Z",
"updatedAt": "2020-02-16T12:39:05.154Z",
"__v": 0
回复:
"_id": "5e4937e9e2454a2c0c162890",
"page": "About",
"messages": [
"_id": "5e4937e9e2454a2c0c162892",
"name": "Abou1",
"message": "About1 message..."
,
"_id": "5e4937e9e2454a2c0c162891",
"name": "Abou2",
"message": "About2 message..."
],
"createdAt": "2020-02-16T12:39:05.154Z",
"updatedAt": "2020-02-16T12:39:05.154Z",
"__v": 0
如果稍后我们想向页面添加消息,我们可以使用以下 put 路由。
router.put("/pages/:id", async (req, res) =>
const result = await Page.findByIdAndUpdate(
req.params.id,
$push: messages: req.body
,
new: true
);
res.send(result);
);
请求正文:
"name": "Abou3",
"message": "About3 message..."
回复:
"_id": "5e4937e9e2454a2c0c162890",
"page": "About",
"messages": [
"_id": "5e4937e9e2454a2c0c162892",
"name": "Abou1",
"message": "About1 message..."
,
"_id": "5e4937e9e2454a2c0c162891",
"name": "Abou2",
"message": "About2 message..."
,
"_id": "5e493926f905ab3300106f94",
"name": "Abou3",
"message": "About3 message..."
],
"createdAt": "2020-02-16T12:39:05.154Z",
"updatedAt": "2020-02-16T12:44:22.763Z",
"__v": 0
当客户端需要页面的消息时,我们需要做的就是通过页面的 id 或页面名称来检索页面:
router.get("/pages/id/:id", async (req, res) =>
const result = await Page.findById(req.params.id);
res.send(result);
);
//or
router.get("/pages/name/:name", async (req, res) =>
const result = await Page.findOne( page: req.params.name );
res.send(result);
);
【讨论】:
以上是关于使用 Node JS 在猫鼬中存储多个文本的理想方法?的主要内容,如果未能解决你的问题,请参考以下文章