mongoose.save不是一个函数

JS:

var express = require('express'); var router = express.Router(); // Mongoose var mongoose = require('mongoose'); var mongoosedb = 'DBURL'; mongoose.connect(mongoosedb); var database = mongoose.connection; database.on('error', console.error.bind(console, 'connection error:')); database.once('open', function() { console.log('Mongoose is connected.'); }); var taskSchema = mongoose.Schema({ name: String, isDone: Boolean }); var Tasks = mongoose.model('Tasks', taskSchema); // Get all tasks router.get('/tasks', function(req, res, next) { Tasks.find(function(err, tasks) { if(err) { console.log('error'); res.send(err); } res.json(tasks); }); }); // Get single task router.get('/task/:id', function(req, res, next) { Tasks.findOne({_id: mongojs.ObjectId(req.params.id)}, function(err, task) { if(err) { res.send(err); } res.json(task); }); }); // Save task router.post('/task', function(req, res, next) { var task = req.body; if(!task.title || !(task.isDone + '')) { res.status(400); res.json({ "error": "Bad Data" }); } else { task.save(function(err, task) { if(err) { res.send(err); } res.json(task); }) } }); // Delete task router.delete('/task/:id', function(req, res, next) { Tasks.remove({_id: mongojs.ObjectId(req.params.id)}, function(err, task) { if(err) { res.send(err); } res.json(task); }); }); // Update task router.put('/task/:id', function(req, res, next) { var task = req.body; var updTask = {}; if (task.isDone) { updTask.isDone = task.isDone; } if (task.title) { updTask.title = task.title; } if (!updTask) { res.status(400); res.json({ "error": "Bad Data" }); } else { task.update({_id: mongojs.ObjectId(req.params.id)}, updTask, {}, function(err, task) { if(err) { res.send(err); } res.json(task); }); } }); module.exports = router; 

我只是试图用Mongoose添加一条logging到MongoDB。

谷歌search后,我找不到答案。 我的.find和.findOne方法工作正常,但由于某种原因,我得到的错误task.save is not a function 。 我究竟做错了什么?

我认为你的任务创build是不正确的。

首先继续,将您的模型导入到您的依赖关系的顶部,以便我们可以直接访问模型方法:

 var express = require('express'); var router = express.Router(); // Mongoose var mongoose = require('mongoose'); var mongoosedb = 'DBURL'; var Task = require('mongoose').model('Task'); // add your Task model 

然后,在保存任务代码中,将其更改为:

 // Save task router.post('/task', function(req, res, next) { var task = new Task(req.body) // See http://mongoosejs.com homepage demo example for basic creation if(!task.title || !(task.isDone + '')) { res.status(400); res.json({ "error": "Bad Data" }); } else { task.save(function(err, task) { if(err) { res.send(err); } res.json(task); }) } }); 

当你目前的任务创build设置,你只是设置它的req.body内容,而不是实际上通过mongoose方法初始化一个实例。

我个人喜欢使用mongoose的承诺,只是因为我更喜欢这种风格。 但是你也可以做这样的事情,如果你已经通过把它作为一个依赖来获取你的任务模型(如上所示):

 Task.create(req.body) .then(function(newTask) { console.log("Task created successfully."); return res.json(newTask); // using res.json here }) .catch(function(err) { console.log("There was a problem creating task."); return res.status(500).json(err); // sends status with json obj }) 

无论如何,我希望这有助于,让我知道如果这个工作,如果没有,我会稍后检查,看看!

您的variablestask是您之前定义的正文对象:

 var task = req.body; 

如果您想从中生成Tasks文档,请使用:

 var newTask = new Tasks(task); newTask.save(function(err, task) { if (err) { res.send(err); } res.json(task); }); 

检查mongoose模型文件

你也将task.updateTasks.update混淆了