gpt4 book ai didi

node.js - 使用 Mongoose 库更新 Express JS 中的数据库架构

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:00 25 4
gpt4 key购买 nike

我已经在 Express.js 中使用 Mongoose 创建了 Mongo DB 架构,并且正在构建 REST API。但是,当我尝试更新现有记录时,未从架构更新的值会自动变为空。我明白为什么会发生这种情况,只是不确定应该如何编码。

这是路线:

router.patch("/:projectId", async (req, res) => {
try {
const updatedProject = await Project.updateOne(
{ _id: req.params.projectId },
{
$set: {
title: req.body.title,
project_alias: req.body.project_alias,
description: req.body.description
}
}
);
res.json(updatedProject);
} catch (err) {
res.json({ message: err });
}
});

这里还有架构:

const ProjectsSchema = mongoose.Schema({
title: {
type: String,
required: true,
unique: true
},
project_alias: {
type: String,
unique: true,
required: true
},
description: String,
allowed_hours: Number,
hours_recorded: {
type: Number,
default: 0
},
date_added: {
type: Date,
default: Date.now
}
});

我的问题是,当我只想更新标题时:

{
"title" : "Title Updated33"
}

描述和别名变为空。我应该实现检查吗?

最佳答案

只需使用 req.body 作为更新对象,如下所示:

router.patch("/:projectId", async (req, res) => {

try {
const updatedProject = await Project.updateOne(
{ _id: req.params.projectId },
req.body
);
res.json(updatedProject);
} catch (err) {
res.json({ message: err });
}
});

或者更好的是,创建一个像这样的辅助函数,以便我们可以排除模型中不存在的主体中的字段:

const filterObj = (obj, ...allowedFields) => {
const newObj = {};
Object.keys(obj).forEach(el => {
if (allowedFields.includes(el)) newObj[el] = obj[el];
});
return newObj;
};

router.patch("/:projectId", async (req, res) => {
const filteredBody = filterObj(
req.body,
"title",
"project_alias",
"description",
"allowed_hours",
"hours_recorded"
);

try {
const updatedProject = await Project.updateOne(
{ _id: req.params.projectId },
filteredBody
);
res.json(updatedProject);
} catch (err) {
res.json({ message: err });
}
});

关于node.js - 使用 Mongoose 库更新 Express JS 中的数据库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com