我处于MEAN堆栈的初级阶段,尝试使用以下教程:adrianmejia.com/blog/2014/10/01/creating-a-restful-api-tutorial-with-nodejs-and- MongoDB的/。我正在使用Cloud 9在线IDE。
本教程的一部分涉及使用curl和Postman测试数据库POST。我成功发布了一个GET请求,在教程的这一点上给了一个空数组。
我用
curl -XGET myc9urlhere:8080/todos
- 成功(获得[])
尝试curl -XPOST myc9urlhere:8080/todos -d 'name=Somename&completed=false¬e=somenote'
- 失败
堆栈跟踪如下:
ValidationError: Todo validation failed
at MongooseError.ValidationError (/home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/error/validation.js:23:11)
at model.Document.invalidate (/home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/document.js:1486:32)
at model.Document.set (/home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/document.js:753:10)
at model._handleIndex (/home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/document.js:596:14)
at model.Document.set (/home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/document.js:556:24)
at model.Document (/home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/document.js:68:10)
at model.Model (/home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/model.js:47:12)
at new model (/home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/model.js:3250:13)
at /home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/model.js:1864:51
at /home/ubuntu/workspace/todo-api/node_modules/mongoose/node_modules/async/internal/parallel.js:27:9
at eachOfArrayLike (/home/ubuntu/workspace/todo-api/node_modules/mongoose/node_modules/async/eachOf.js:57:9)
at exports.default (/home/ubuntu/workspace/todo-api/node_modules/mongoose/node_modules/async/eachOf.js:9:5)
at _parallel (/home/ubuntu/workspace/todo-api/node_modules/mongoose/node_modules/async/internal/parallel.js:26:5)
at parallelLimit (/home/ubuntu/workspace/todo-api/node_modules/mongoose/node_modules/async/parallel.js:85:26)
at /home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/model.js:1882:5
at Function.create (/home/ubuntu/workspace/todo-api/node_modules/mongoose/lib/model.js:1852:17)
一个小小的注意事项是我也尝试使用Chrome扩展程序Postman。教程说我必须使用x-www-form-urlencoded
,它会返回相同的错误。见截图。如果我转向表单数据设置,我实际上成功地将一些数据插入到数据库中,但这只是假的东西。请参见第二个屏幕截图。
我真的试图自己研究 - 也许这个教程不是最好的开始:)。下面我将介绍代码的一些细节。
非常感谢您解决此问题的任何帮助。
与教程相同,我为todo-list项创建了一个Model,如图所示(Todo.js):
var mongoose = require('mongoose');
var TodoSchema = new mongoose.Schema({
name: String,
completed: Boolean,
note: String
});
module.exports = mongoose.model('Todo', TodoSchema);
现在在我的快递路由文件todos.js中,我有以下代码:
var express = require('express');
var router = express();
//express.Router() was the original here, that failed on router.get
//as router was then undefined for some reason.
var Todo = require('../models/Todo.js');
/* GET /todos listing. */
router.get('/', function(req, res, next) {
Todo.find(function (err, todos) {
if (err) return next(err);
res.json(todos);
});
});
/* POST /todos */
router.post('/', function(req, res, next) {
Todo.create(req.body, function (err, post) {
if (err) return next(err);
res.json(post);
});
});
module.exports = router;
因为我不知道到底出了什么问题,我还会发布我的app.js摘录,显示我的数据库连接
var routes = require('./routes/index');
var users = require('./routes/users');
var todos = require('./routes/todos');
var app = express();
// load mongoose package
var mongoose = require('mongoose');
// Use native Node promises
mongoose.Promise = global.Promise;
// connect to MongoDB
mongoose.connect('mongodb://'+process.env.IP+'/todo-api')
.then(() => console.log('connection succesful'))
.catch((err) => console.error(err));
app.use('/', routes);
app.use('/users', users);
app.use('/todos', todos);
生成的package-json(我正在使用Cloud 9 IDE)
{
"name": "application-name",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node app.js"
},
"dependencies": {
"ejs": "*",
"express": "3.2.6",
"mongoose": "^4.7.6"
}
}
答案 0 :(得分:0)
我认为您在这里遇到的主要问题是所有帖子参数都是字符串。对于name
的{{1}}和note
字段,最终会很好,但在TodoSchema
字段时会中断,因为它是布尔值。要解决此问题,请尝试在创建ToDo条目之前将字符串转换为布尔值。
completed
此外,虚假帖子工作的原因是因为您没有验证您的帖子数据。考虑确保通过您的路线进入的帖子数据包含所有必填字段,并且不包含任何危险信息。
答案 1 :(得分:0)
转到目录中的data文件夹。里面有一个文件mongod.lock。删除它(你不需要root权限)只需使用rm mongod.lock。回到主目录并输入./mongod。希望这能解决问题