【问题标题】: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)

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案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 有什么区别?
      猜你喜欢
      • 2016-01-23
      • 2018-09-09
      • 2020-10-06
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多