Sequelize string 不是函数错误,为啥?

Posted

技术标签:

【中文标题】Sequelize string 不是函数错误,为啥?【英文标题】:Sequelize string is not a function error , why?Sequelize string 不是函数错误,为什么? 【发布时间】:2019-06-08 09:10:50 【问题描述】:

请需要你的帮助。 为什么我在昵称对象中收到 String(150) 的奇怪错误?

const Sequelize = require('sequelize');
const devOptions = require('./../config/config').connectionConf.development;

const sequelize = new Sequelize(
  devOptions.database,
  devOptions.username,
  devOptions.password,
  
    host: devOptions.host,
    dialect: devOptions.dialect
  
);

const User = sequelize.define('user', 
    user_id: 
      primaryKey:true,
      type:sequelize.BIGINT,
      allowNull:false 
   ,
    nickname: 
      type:sequelize.STRING(150),
      unique:true,
      allowNull:false
    ,
    email: 
      type:sequelize.STRING(150),
      unique:true,
      allowNull:false
    ,
    user_password: 
      type:sequelize.STRING(150),
      unique:true,
      allowNull:false
    ,
    created_at: 
      type:sequelize.Date,
      created_time:sequelize.NOW,
      allowNull:false
    ,
    updated_at: 
      type:sequelize.Date,
      allowNull:false
    
  , );

TypeError: sequelize.STRING 不是函数 在对象。 (E:\Projects\javascript\couponsystem\src\models\schema.js:21:22) 在 Module._compile (internal/modules/cjs/loader.js:688:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10) 在 Module.load (internal/modules/cjs/loader.js:598:32) 在 tryModuleLoad (internal/modules/cjs/loader.js:537:12) 在 Function.Module._load (internal/modules/cjs/loader.js:529:3) 在 Module.require (internal/modules/cjs/loader.js:636:17) 在需要(内部/模块/cjs/helpers.js:20:18) 在对象。 (E:\Projects\JavaScript\couponsystem\src\models\generator.js:1:78) 在 Module._compile (internal/modules/cjs/loader.js:688:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10) 在 Module.load (internal/modules/cjs/loader.js:598:32) 在 tryModuleLoad (internal/modules/cjs/loader.js:537:12) 在 Function.Module._load (internal/modules/cjs/loader.js:529:3) 在 Function.Module.runMain (internal/modules/cjs/loader.js:741:12) 启动时(内部/bootstrap/node.js:285:19) 在 bootstrapNodeJSCore (internal/bootstrap/node.js:739:3)

【问题讨论】:

【参考方案1】:

由于无法使用sequelize 访问数据类型这一事实引起我的兴趣,我开始查看模块的主类。

当您这样做const Sequelize = require('sequelize'); 时,您正在调用一个扩展数据类型的接口(它们也是一个接口),因此您可以毫无问题地使用 BIGINT 或 STRING。

但是当你这样做时

const sequelize = new Sequelize(
    devOptions.database,
    devOptions.username,
    devOptions.password,
    
        host: devOptions.host,
        dialect: devOptions.dialect
    
);

您指的是上述接口的构造函数(构造签名)。这导致sequelize 中的对象是另一个类或函数的实例,而不是对Sequelize 的直接引用,这就是它们具有不同属性的原因。


总之,这将是执行您请求的代码实现的正确方法。

const Sequelize = require('sequelize');
const devOptions = require('./../config/config').connectionConf.development;

const sequelize = new Sequelize(
    devOptions.database,
    devOptions.username,
    devOptions.password,
    
        host: devOptions.host,
        dialect: devOptions.dialect
    
);

const User = sequelize.define('user', 
    user_id: 
        primaryKey: true,
        type: Sequelize.BIGINT,
        allowNull: false
    ,
    nickname: 
        type: Sequelize.STRING(150),
        unique: true,
        allowNull: false
    ,
    email: 
        type: Sequelize.STRING(150),
        unique: true,
        allowNull: false
    ,
    user_password: 
        type: Sequelize.STRING(150),
        unique: true,
        allowNull: false
    ,
    created_at: 
        type: Sequelize.Date,
        created_time: Sequelize.NOW,
        allowNull: false
    ,
    updated_at: 
        type: Sequelize.Date,
        allowNull: false
    
, );

接口中的构造签名不能在类中实现;它们仅用于定义定义“新”能力的现有 JS API 功能。

【讨论】:

【参考方案2】:

这应该有效,有关更多信息,请阅读下面的文档。

const Sequelize = require('sequelize');
const devOptions = require('./../config/config').connectionConf.development;

const sequelize = new Sequelize(
  devOptions.database,
  devOptions.username,
  devOptions.password,
  
    host: devOptions.host,
    dialect: devOptions.dialect
  
);

const User = sequelize.define('user', 
    user_id: 
      primaryKey:true,
      type:sequelize.BIGINT,
      allowNull:false 
   ,
    nickname: 
      type:sequelize.STRING,
      unique:true,
      allowNull:false
    ,
    email: 
      type:sequelize.STRING,
      unique:true,
      allowNull:false
    ,
    user_password: 
      type:sequelize.STRING,
      unique:true,
      allowNull:false
    ,
    created_at: 
      type:sequelize.Date,
      created_time:sequelize.NOW,
      allowNull:false
    ,
    updated_at: 
      type:sequelize.Date,
      allowNull:false
    
  , );

Docs, Extra info

【讨论】:

这样的语法有什么问题???类型:sequelize.STRING(150) 文档 - docs.sequelizejs.com/manual/tutorial/… 嗯,错误非常具体。 STRING 不是函数。所以要么需要一个错误的“Sequalize”。或者文档是错误的。或者输出在说谎。或者,更有可能。 “sequalize” const 使用不相关的参数启动。 @ArelSapir 文档:docs.sequelizejs.com/variable/…,明确指出sequalize.STRING 是一个函数。 所以,正如我所说。它可能是以下情况之一:需要错误的“Sequalize”。或者文档是错误的。或者输出在说谎。或者“sequalize”常量使用错误的参数启动。 sequelize.STRING 和 Sequelize.STRING 有什么区别?

以上是关于Sequelize string 不是函数错误,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize db.define 是否一个函数?

同步 sequelize 模型:sequelize.import() 不是函数(并且已弃用)

类型错误:defineCall 不是函数。要求()失败

Sequelize.define() 不是函数?

Sequelize-typescript 'HasManyCreateAssociationMixin' 不是函数

Sequelize findAll 不是函数