【问题标题】:Cannot read 'create' property of undefined无法读取未定义的“创建”属性
【发布时间】:2020-07-12 10:22:08
【问题描述】:

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

TypeError:无法读取未定义的属性“创建”。

这是控制器:

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

【问题讨论】:

  • 请添加 modelscontrollers 文件。似乎问题在于您重新导出TodotodoContoller 的方式
  • 我现在才这样做。谢谢@YuryTarabanko
  • 您将todo 模型导出为工厂函数。您是否还可以在调用此工厂的位置添加代码以创建 Todo 模型。 models/index.js 我猜。

标签: node.js express


【解决方案1】:

那是因为你导入错误...

变化:

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

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

【讨论】:

    【解决方案2】:

    不应该

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

    但是

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

    因为您的createlist 函数不在todo 中,而是在module.exports 的根目录中。

    create和list函数实际上是在“todo.js”文件中 “控制器”目录。

    那么你应该要求它们

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

    除非你有 controllers/index.js

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

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

    【讨论】:

    • 创建和列出函数其实在“controllers”目录下的“todo.js”文件中。
    • 我实际上有一个 'controller/index.js' 文件。内容附加到问题中。
    • 那时一切似乎都很好。需要后请在此处复制todosController 的值。
    猜你喜欢
    • 2020-10-15
    • 2020-05-28
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多