2016-11-19 12 views
3

私が試しても、私はこのエラーを取り除くことはできませんし、私のアプリケーションでは、モンゴースモデルのインスタンスを作成するこれとほぼ同じように見えるし、すべて正常に動作します。MongoDB - ObjectIdへのキャストがパス "_id"で値 "作成"に失敗しました

CastError: Cast to ObjectId failed for value "create" at path "_id" 

_idについてこのエラーを投げかけているのは何ですか?私は_idの値がMongooseによって自動的に生成されたという印象を受けました。投稿データにidまたは_idがないことを絶対に保証します。来るのはtitledescriptionです。

これは私のProjectスキーマです:

// Project Schema 
var mongoose = require('mongoose'); 
var ProjectSchema = new mongoose.Schema({ 
    title: String, 
    description: String 
}); 

module.exports = mongoose.model('Project', ProjectSchema); 

そして、これは私のポストルートです。簡潔にするためにコードを省略しました。私はsave方法にcreate方法を使用してから変更した場合

var express = require('express'); 
var router = express.Router(); 
var Project = require('../models/project'); 

router.post('/project/create', function(req, res, next) { 
    var data = { 
     title: req.body.title, 
     description: req.body.description 
    }; 

    Project.create(data, function(err, docs) { 
     if (err) { 
      return next(err); 
     } 

     if (!docs) { 
      return res.send('Failed to create project'); 
     } 

     res.send('Project created'); 
    }); 
}); 

module.exports = router; 

最後に、私はまだ同じエラーを取得します。

var project = new Project(data); 

project.save(function(err) { 
    if (err) { 
     return next(err); 
    } 

    res.send('Project created'); 
}); 
+0

おそらくタイプミスですが、 'Project'が必要ですか? – Matthematics

+0

おっと、はい私のコードサンプルにそれを含めるのを忘れました。@Hypermatttを指摘してくれてありがとう – wavematt

+0

あなたは 'mongoose'のどのバージョンを使用していますか? – Matthematics

答えて

0

質問に貼り付けられたコードが問題なく動作しているように、アプリケーションの他の部分でエラーが発生する可能性があります。

エラーをデバッグしようとしたときのサンプルコードです。それを実行し、それがあなたのローカルで動作するかどうかを確認してみてください。

index.js

'use strict'; 

const mongoose = require('mongoose'); 
mongoose.Promise = Promise; 
mongoose.connect('mongo'); 

const ProjectSchema = new mongoose.Schema({ 
    title: String, 
    description: String 
}); 

const Project = mongoose.model('Project', ProjectSchema); 

////////////////////////////////////////////////////////////////////////////// 

const PORT = (process.env.PORT || 1337); 
const express = require('express'); 
const app = express(); 

const bodyParser = require('body-parser'); 
const router = express.Router(); 

router.post('/project/create', 
    bodyParser.json(), 
    (req, res) => { 
    console.log('request body:', req.body); 

    const title = req.body.title; 
    const description = req.body.description; 

    Project.create({ title, description }) 
    .then(doc => res.json(doc)) 
    .catch(err => res.json(err)); 
    } 
); 

app.use(router); 
app.listen(PORT,() => console.log(`now listening on port ${PORT}`)); 

package.json

{ 
    "name": "stack-overflow", 
    "main": "index.js", 
    "scripts": { 
    "start": "nodemon" 
    }, 
    "dependencies": { 
    "body-parser": "^1.15.2", 
    "express": "^4.14.0", 
    "mongodb": "^2.2.11", 
    "mongoose": "^4.6.5" 
    }, 
    "devDependencies": { 
    "nodemon": "^1.11.0" 
    } 
} 

docker-compose.yml

mongo: 
    image: 'mongo:3' 
node: 
    image: 'node:5.9.1' 
    command: 'npm start' 
    working_dir: '/var/app' 
    links: 
    - mongo 
    volumes: 
    - '.:/var/app' 
    ports: 
    - '1337:1337' 

例要求:

curl -X "POST" "http://localhost:1337/project/create" \ 
-H "Content-Type: application/json; charset=utf-8" \ 
-d "{\"title\":\"testing\",\"description\":\"just another description\"}" 
0

私はこの問題の診断を助けるために自分のコードのより多くを掲載している必要があります。それは私の/project/createルートが問題だったことが判明しました。

また、プロジェクトを表示する別のルートは/project/:idでした。私は私のルートの/createの部分がこのロジックを妨害していると考えていたので、私のルートのパスを変更しました。私のアプリのこの機能の

// Before 
router.get('/projects', projects); // view all projects 
router.get('/project/:id, project); // view a project 
router.post('/project/:id', projectUpdate); // update a project 
router.post('/project/create', projectCreate); // create a project 
router.post('/project/delete/:id', projectDelete); // delete a project 

私のルートは、次のようになります。私は今日の教訓を学んだ

// After 
router.get('/projects', projects); // view all projects 
router.get('/project/:id', project); // view a project 
router.post('/project/', projectCreate); // create a project 
router.post('/project/:id', projectUpdate); // update a project 
router.post('/project/delete/:id', projectDelete); // delete a project 

!ヘルプ@Hypermatttをありがとう。

関連する問題