无法读取未定义

时间:2017-08-18 09:14:33

标签: node.js express

我正在学习使用Express,Nodejs,Sequelize,Postgres构建应用程序的教程。 在创建我的控制器和路由之后,GET路由完美地工作但是POST路由(意味着调用用于创建对象的回调函数)失败了:

  

TypeError:无法读取undefined的属性'create'。

这是控制器:

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,
};

2 个答案:

答案 0 :(得分:0)

应该不是

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

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

因为createlist函数不在todo但在module.exports的根目录中。

  

创建和列表函数实际上是在“todo.js”文件中   “控制器”目录。

然后你应该要求它们作为

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

除非你有controllers/index.js

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

另请注意,您的文件似乎被称为todo,而不是todos

答案 1 :(得分:0)

这是因为您导入错误...

更改:

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

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