2017-08-18 13 views
0

私はExpress、Nodejs、Sequelize、Postgresでアプリケーションを構築するチュートリアルに従っています。 は私のコントローラとルートを作成した後、GETルートは完璧に動作しますが、POSTルートは(オブジェクトを作成するためのコールバック関数を呼び出すことを意味する)で失敗します。未定義の「作成」プロパティを読み取ることができません

TypeError: cannot read property 'create' of undefined.

これはコントローラです:

let Todo = require('../models').todo; 

module.exports = { 
    create(req, res){ 
     return Todo 
     .create({title:req.body.title,}) 
     .then(todo => res.status(201).send(todo)) 
     .catch(error => res.status(400).send(error)); 
    }, 
    list(req, res){ 
     return Todo 
     .all() 
     .then(todos => res.status(200).send(todos)) 
     .catch(error => res.status(400).send(error)); 
    }, 
}; 

これは経路の定義です

const todosController = require('../controllers').todos; 


module.exports = app => { 
    app.get('/api', (req, res) =>res.status(200).send({message:"welcome to the todos API!"})); 
    app.post('/api/todos', todosController.create); 
    app.get('/api/todos', todosController.list); 
}; 

...ここではtodoモデルです。おかげ@Yuri Tarabanko

'use strict'; 
 

 
module.exports = (sequelize, DataTypes) =>{ 
 
    const Todo = sequelize.define('Todo', { 
 
    title:{ 
 
     type:DataTypes.STRING, 
 
     allowNull: false 
 
    }, 
 
    }, 
 
    { 
 
    classMethods: { 
 
     associate: (models) => { 
 
     Todo.hasMany(models.TodoItem, 
 
      { 
 
      foreignKey:'todoId', 
 
      as: 'todoItems', 
 
      
 
      }); 
 
      }, 
 
     }, 
 
    } 
 
    ); 
 
    return Todo; 
 
};

controllers/index.jsファイルを以下に示します。

const todos = require('./todos'); 
 
module.exports = { 
 
    todos, 
 
};

+0

'モデル'と 'controllers'ファイルを追加します。問題は、あなたが 'Todo'または' todoContoller'のどちらかを再エクスポートする方法であるようです。 –

+0

私はちょうどそれをしました。ありがとう@YuryTarabanko –

+0

'todo'モデルをファクトリ関数としてエクスポートします。このファクトリを呼び出す場所にコードを追加して 'Todo'モデルを作成することもできますか? 'models/index.js'だと思います。 –

答えて

0

あなたcreatelist機能がtodoではなく、のルートではないためではない

const todosController = require('../controllers').todos; 

しかし

const todosController = require('../controllers'); 

であるべき。あなたは

modules.exports={todo:require(todo)}; 

はまた、あなたのファイルがtodostodoないと呼ばれているように見えることに注意していcontrollers/index.jsを持っていない限り

create and list functions are actually in the "todo.js" file in the "controllers" directory.

次に、あなたは

const todosController = require('../controllers/todo'); 

としてそれらを要求すべきです。

+0

createおよびlist関数は実際には "controllers"ディレクトリの "todo.js"ファイルにあります。 –

+0

答えを確認してください – Jehy

+0

私は実際に 'controller/index.js'ファイルを持っています。内容は質問に追加されます。 –

関連する問題