我正在做这个API把请求纠正与mongoose?

所以我正在使用mongoose和mongodb,并表示路由来做到这一点。

我有一个用户文档的创build“todolist”空数组,我想能够编辑这个任务添加到列表以及编辑这些任务。

现在我正在考虑最好的办法是让服务器检查req.body是否有一些variables来设置我需要编辑的文档的哪一部分。

这是正确的方法,或者我想为这样的事情创build一个新的API路由,或者我通过检查来自客户端的reqvariables,以确定我想要在服务器上编辑正确做到这一点? 还有更干净的方法吗?

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'}); }) }) }); 

我build议你用恰当的实体为你的数据库build模,从User创build一个Task模型,并添加一个User引用,如下所示:

 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' }] }); 

为此,为了使事情变得更简单,您应该创build一个预保存钩子来自动向用户添加任务:

 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(); } }); 

这样,正确的方法就是提供与实体相关的端点。 所以,要创build一个任务,用户应该使用body { user: '123', name: 'name', ... }请求POST /tasks

 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); }); }); 

它会自动添加任务到用户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) { ... }); }); 

对于上面这样的查询,我build议你使用一些类似于查询的库来parsing查询string(例如GET /users?q=Some+Search&limit=10&page=2 )到MongoDB查询参数。

希望能帮助到你。 🙂