【问题标题】:Sequelize - Model.create is not a function / Model.build is not a functionSequelize - Model.create 不是函数/Model.build 不是函数
【发布时间】:2021-12-04 23:04:27
【问题描述】:

我正在使用 Node.js、Sequelize、Mysql、Express 创建一个应用程序。我对此很陌生,如果这个问题很愚蠢,我很抱歉。

我有两个具有一对多关系的模型:用户和令牌(一个用户有多个令牌,一个令牌有一个用户)。

这是文件:

models/user.js

const { Sequelize, DataTypes } = require('sequelize');
const Token = require('./token')
const db = require('../db/sequelize'),
      sequelize = db.sequelize,
      jwt = require('jsonwebtoken')

// Model for a user (player)

const User = sequelize.define('User', {
    // All the columns
})
    
User.gAuth = async function(user) {
    const token = jwt.sign({id: user.id.toString() },
        'password',
        {
            expiresIn: '7 days'
        })

    console.log(token)
    console.log(Token)

    const newToken = Token.create({
        token,
        user: this.id
    })

    console.log(newToken)

    await newToken.save()

    return token

}

module.exports = User

我的错误是在“const newToken = Token.create({...})”上。它说:“Token.create 不是函数”。我试过构建,我有:“TypeError:Token.build is not a function”。

模型/token.js

const { Sequelize, DataTypes } = require('sequelize');
const db = require('../db/sequelize'),
    sequelize = db.sequelize
const User = require('./user')

const Token = sequelize.define('Token', {
    // All the columns
})

User.hasMany(Token, {
    as: 'tokens'
})

Token.belongsTo(User, {
    foreignKey: 'UserId',
    as: 'user'
})

module.exports = Token

你能帮我理解我做错了什么吗?我找到的所有答案都是关于模型的错误导出,但我没有看到我的错误。

谢谢!

编辑:

当我在 models/token.js 中使用 console.log(sequelize.models) 时,它返回:{ User: User, Token: Token }

但是!当我在 models/user.js 中 console.log(sequelize.models) 时,它会重新调整:{ User: User }

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    试试这个:

    const { Sequelize, DataTypes } = require('sequelize');
    const db = require('../db/sequelize'),
          sequelize = db.sequelize,
          jwt = require('jsonwebtoken')
    const Token = require('./token')(sequelize, Sequelize)
    

    编辑:

    根据docs,不要直接导入令牌,而是尝试像这样从 sequelize 实例中抓取令牌:

    const db = require('../db/sequelize'),
       sequelize = db.sequelize,
       jwt = require('jsonwebtoken')
    const token = sequelize.models.Token
    

    【讨论】:

    • 它使应用程序崩溃并出现以下错误:TypeError: require(...) is not a function
    • 您可以做的一件事是 console.log(Token) 并告诉我它说了什么。如果它是一个对象,那么你可以使用 const {Token} = require('./token')
    • 当我 console.log(Token) 它给了我这个:“{}”。我尝试了“const {Token}”,但现在当我尝试/catch Token.create 时出现此错误:“无法读取未定义的属性 'create'”
    • 在查看文档后我更新了我的答案
    • 很遗憾它不起作用:令牌现在未定义。
    【解决方案2】:

    好的!我发现我做错了:构建我的文件。

    我的函数 gAuth 不应该在 models/user.js 上,而是在 models/token.js 上。将其留在 user.js 上会导致 循环依赖,从而导致错误。

    我已从 user.js 中删除 gAuth,将其移至 token.js 并从 user.js 中删除 require('./token')

    我希望这可以帮助一些有同样问题的人!

    非常感谢 @about14sheep 帮助我。

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 1970-01-01
      • 2020-04-08
      • 2018-07-30
      • 2017-04-24
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      相关资源
      最近更新 更多