gpt4 book ai didi

node.js - 我是否使用 mongoose 正确执行此 API Put 请求?

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:22 24 4
gpt4 key购买 nike

所以我使用 mongoose 和 mongodb 以及快速路由来做到这一点。

我有一个用户文档,在创建时有一个空数组 - “todolist”,我希望能够编辑它以将任务添加到列表中以及编辑这些任务。

现在我认为最好的方法是让服务器检查 req.body 是否设置了某些变量以了解我需要编辑文档的哪一部分。

这是正确的方法还是我应该为类似的事情创建一个新的 API 路由,或者我是否通过检查客户端的 req 变量来确定我想要在服务器上编辑的内容来正确地执行此操作?有没有更干净的方法来做到这一点?

router.put('/:user_id', function(req, res) {
User.findById(req.params.user_id, function(err, user){
if(err){
res.send(err);
return err;
}

if(req.body.createTask) {
user.todolist.push({
"task_name": req.body.task_name,
"task_importance": req.body.importance,
"task_completed": false
})
}else if(req.body.edit_task){
if(req.body.edit_task_name) {
user.todolist[req.body.index].task_name = req.body.new_task_name;
}else if(req.body.edit_task_importance) {
user.todolist[req.body.index].task_importance = req.body.new_task_importance;
}else if(req.body.edit_task_completed) {
user.todolist[req.body.index].task_completed = true;
}
}

user.save(function(err){
if(err)
res.send(err);
res.json({message: 'User updated'});
})
})
});

最佳答案

我建议您使用适当的实体对数据库进行建模,与用户分开创建任务模型并添加对用户的引用,如下所示:

var TaskSchema = new mongoose.Schema({
user: {
type: mongoose.Schema.ObjectId,
ref: 'User'
},
name: String,
importance: String,
completed: Boolean
});

如果您愿意,您还可以添加对用户任务的引用:

var User = new mongoose.Schema({
// note this is an array
todolist: [{
type: mongoose.Schema.ObjectId,
ref: 'Task'
}]
});

这样做,为了让事情变得更简单,您应该创建一个 pre save hook自动向用户添加任务:

TaskSchema.pre('save', function(next) {
if (this.isModified('user') && this.user) {
// $addToSet will add this document to the user's todolist (if it's not already there)
User.findOneAndUpdate({_id: this.user}, {$addToSet: {todolist: this}}, function(err, doc) {
next(err);
})
} else {
next();
}
});

这样,正确的方法就是提供与实体相关的端点。因此,要创建任务,用户应使用正文请求 POST/tasks { user: '123', name: 'name', ... }:

router.post('/tasks', function(req, res) {
Task.create(req.body, function(err, task) {
if (err) return res.status(500).send(err);
return res.status(201).json(task);
});
});

它会使用我们的预保存 Hook 自动将任务添加到用户123。要编辑任务,只需在任务端点上进行编辑即可:

router.put('/tasks/:id', function(req, res) {
Task.findById(req.params.id, function(err, task) {
if (err) return res.status(500).send(err);
if (!task) return res.status(404).send('Not Found');

task.name = req.body.name || task.name;
task.importance = req.body.importance || task.importance;
task.completed = true;

task.save(function(err, task) {
if (err) return res.status(500).send(err);
res.status(200).json(task);
});
});
});

您不需要编辑用户,因为它只保留任务引用。

如果您想让用户填充任务数据(而不仅仅是他们的 ID),只需执行以下操作:

router.get('/users', function(req, res) {
User.find({}).populate('todolist').exec(function(err, users) {
...
});
});

对于像上面这样的查询,我建议您使用一些库,例如 querymen ,它将查询字符串(例如 GET/users?q=Some+Search&limit=10&page=2)解析为 MongoDB 查询参数。

希望有帮助。 :)

关于node.js - 我是否使用 mongoose 正确执行此 API Put 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37927798/

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