【问题标题】:AuthenticationController always throws error, TypeError: Cannot read property 'create' of undefinedAuthenticationController 总是抛出错误,TypeError: Cannot read property 'create' of undefined
【发布时间】:2021-11-18 11:45:17
【问题描述】:

我遇到了与 sequelize 和 sqlite 一起使用的 Authenticati onController 的问题 当我使用邮递员测试 POST 请求时,它总是给出状态 400 和响应 { 错误:'出了点问题' } 这是日志

::1 - - [21/Jul/2020:15:40:33 +0000] "POST /register HTTP/1.1" 400 30 "-" "PostmanRuntime/7.26.1"

这是AuthenticationController的代码

const {User} = require('../models')
module.exports = {
    async register(req, res){
        try {   
            const user = await User.create(req.body)
            res.send(user.toJSON())
        } catch (error) {
            console.log(error)
            res.status(400).send({
                error: 'Something is wrong'
            })
        }
    }
}

用户模型代码

module.exports = (sequelize, DataTypes) =>
sequelize.define('User', {
    email: {
        type: DataTypes.STRING,
        unique: true
    },
    password: DataTypes.STRING
})

型号索引代码

const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const config = require('../config/config')
const db = {}

const sequelize = new Sequelize(
  config.db.database,
  config.db.user,
  config.db.password,
  config.db.options
)
fs
    .readdirSync(__dirname)
    .filter((file)=>{
        file != 'index.js'
    })
    .forEach((file)=>{
        const model = require(path.join(__dirname, file))(
          sequelize,
          Sequelize.DataTypes
        );
        // const model = sequelize.import(path.join(__dirname,file))
        db[model.name] = model
    })
    db.sequelize = sequelize
    db.Sequelize = Sequelize

module.exports = db

路线代码

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

module.exports = (app) => {
    app.post('/register',
     AuthenticationController.register)
}

之前,它抛出“TypeError:无法读取未定义的属性'create'”的错误 但是当我重新启动服务器时,这是固定的。但是我不知道为什么 try 块会失败。

任何人都可以对此有所了解吗?谢谢

【问题讨论】:

  • 如果 try 块中出现任何错误,注册路由会返回 400 响应。 catch 块中的err 是什么?这是触发 400 响应的问题的起点。
  • 感谢您的评论。我通过添加 "console.log(error)" 修改了 catch 块。这一次,我收到错误“TypeError: Cannot read property 'create' of undefined”。请查看添加的图片
  • 看起来错误发生在User.create(req.body) - User 变量未定义。 User 变量来自模型索引文件。那么为什么模型索引文件中没有定义 db.User 呢?我没有太多使用sequelize,所以没有明显的问题跳出来。但是,我猜它与模型索引文件或用户模型文件中的 forEach 块有关。
  • 你是对的!当我删除 forEach 块并单独定义 db.User 时,它给出了一个错误“TypeError: sequelize.import is not a function”
  • 在这里找到了一个类似的线程stackoverflow.com/questions/47080727/… 但是使用“require”的修复也没有解决我的问题

标签: javascript node.js sqlite sequelize.js


【解决方案1】:

这里是 /models/index.js 的修改代码

const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const config = require('../config/config')
const db = {}

const sequelize = new Sequelize(
  config.db.database,
  config.db.user,
  config.db.password,
  config.db.options
)
fs.readdirSync(__dirname)
    //   .filter((file) => {
    //     file != "index.js";
    //   })
  .filter(
    (file) =>
      file.indexOf(".") !== 0 && file !== "index.js" && file.slice(-3) === ".js"
  )
  .forEach((file) => {
    const model = require(path.join(__dirname, file))(
      sequelize,
      Sequelize.DataTypes
    );
    // const model = sequelize.import(path.join(__dirname,file))
    db[model.name] = model;
  });
    db.sequelize = sequelize
    db.Sequelize = Sequelize

module.exports = db

过滤器块已更新,如修改后的所示,在链接的帮助下 https://www.codota.com/code/javascript/functions/sequelize/Sequelize/import 改变的两件事是

  1. 将“sequelize.import”替换为“require”
  2. 更新了“过滤器”块,如图所示。

结果如下:

感谢 crumkev 的洞察力,让我找到了答案。

【讨论】:

    猜你喜欢
    • 2020-11-07
    • 2020-10-25
    • 2017-12-29
    • 1970-01-01
    • 2016-12-19
    • 2013-04-22
    • 2021-06-25
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多