我正在学习使用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,
};
答案 0 :(得分:0)
应该不是
const todosController = require('../controllers').todos;
但
const todosController = require('../controllers');
因为create
和list
函数不在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')