2017-01-05 16 views
0

Я на начальном уровне со стеком MEAN, пытаясь работать над следующим учебным пособием: adrianmejia.com/blog/2014/10/01/creating-a-restful-api-tutorial-with-nodejs-and-mongodb /. Я использую онлайн-среду Cloud 9.Почему я могу получить мангустскую проверку ValidationError?

Часть учебного курса включает в себя тестирование базы данных POST с использованием curl и Postman. Я успешно отправляю запрос GET, который на данном этапе учебника дает med пустой массив.

Я использую curl -XGET myc9urlhere:8080/todos - с успехом (получение [])

И попробуйте curl -XPOST myc9urlhere:8080/todos -d 'name=Somename&completed=false&note=somenote' - неспособность

StackTrace выглядит следующим образом:

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, который возвращает ту же ошибку. См. Снимок экрана. И если вместо этого перейти к настройке данных формы, мне действительно удастся вставить некоторые данные в базу данных, а просто фиктивные вещи. См. Второй снимок экрана.

Postman fail

Postman form-data

Я действительно пытался исследовать себя - может быть, этот учебник не лучшее место, чтобы начать либо :). Ниже я расскажу о некоторых деталях кода.

Большое спасибо за помощь в решении этой проблемы.

Идентичный учебник, я создал модель для элемента TODO-лист, как показано на рисунке (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); 

И пакет-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

Я думаю, что главная проблема Вы сталкиваетесь в том, что все почтовые параметры являются строками. Это заканчивается отлично для полей name и note вас TodoSchema, но сломается, когда дело доходит до поля completed, так как оно булево. Чтобы решить эту проблему, попробуйте преобразовать строку в логическое значение перед созданием записи ToDo.

/* POST /todos */ 
router.post('/', function(req, res, next) { 
    req.body.completed = (req.body.completed === 'true'); 
    Todo.create(req.body, function (err, post) { 
    if (err) return next(err); 
    res.json(post); 
    }); 
}); 

Кроме того, причина, по которой работает фиктивная почта, заключается в том, что вы не проверяете данные своего сообщения. Подумайте над тем, чтобы данные, поступающие после вашего маршрута, имели все необходимые поля и не содержат ничего опасного.

+0

Спасибо, что ответили. Я экспериментировал с вашим предложением, но проблема сохраняется. Я могу извлечь правильные значения из имени, заполнить и отметить из тела запроса. Все они кажутся правильными, за исключением того, что кажется, что завершенный параметр кэшируется или что-то еще, так как он не изменяется на стороне сервера сразу же, когда я меняю его на стороне клиента - похоже, некоторое время сохраняет старое значение, это нечетно , Я попытался также принудительно ввести действительный логический параметр body, req.body.completed = true; Это также не устраняет ошибку проверки. – BenM

0

Перейти к папке с данными в вашем каталоге. Внутри него находится файл mongod.lock. Удалите его (вы не требуете привилегий root) просто используйте rm mongod.lock. Вернитесь в главный каталог и введите ./mongod.надеюсь, что это решит проблему

 Смежные вопросы

  • Нет связанных вопросов^_^