2017-01-05 3 views
0

私はMEANスタックの初心者レベルで、次のチュートリアルで作業しようとしています:adrianmejia.com/blog/2014/10/01/creating-a-restful-api-tutorial-with-nodejs-and-mongodb /。私はCloud 9オンラインIDEを使用しています。なぜ私はマングースValidationErrorを取得しますか?

このチュートリアルでは、curlとPostmanを使用してデータベースPOSTをテストする方法について説明します。私は正常にGET要求を投稿します。この時点で、チュートリアルのこの時点で空の配列が返されます。

私は curl -XGET myc9urlhere:8080/todos使用 - 成功([]取得)で

curl -XPOST myc9urlhere:8080/todos -d 'name=Somename&completed=false&note=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を使用しなければならないと言います。同じエラーが返されます。スクリーンショットを参照してください。代わりにフォームデータ設定を使用すると、データベースにデータを挿入するのに成功しますが、ちょうど偽のものになります。 2番目のスクリーンショットを参照してください。

Postman fail

Postman form-data

私は本当に自分自身を研究しようとした - 多分このチュートリアルでは、どちらかの開始:)への最大の場所ではありません。以下に、コードの詳細をいくつか紹介します。

ありがとうございました。 (Todo.js)示すように、チュートリアルと同じです

、私は、TODOリスト項目のためのモデルを作成しました:

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; 

私も、データベース接続

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); 
を示す私のapp.jsの抽出物を掲載します

そして、生成されたパッケージ-JSON(私はクラウド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と入力します。これが問題を解決することを願っています。

関連する問題