www.91084.com

GVKun编程网logo

javascript – NodeJS Sequelize – 无法读取未定义的属性’_isSequelizeMethod’(无法读取未定义的属性get)

19

如果您想了解javascript–NodeJSSequelize–无法读取未定义的属性’_isSequelizeMethod’和无法读取未定义的属性get的知识,那么本篇文章将是您的不二之选。我们将深

如果您想了解javascript – NodeJS Sequelize – 无法读取未定义的属性’_isSequelizeMethod’无法读取未定义的属性get的知识,那么本篇文章将是您的不二之选。我们将深入剖析javascript – NodeJS Sequelize – 无法读取未定义的属性’_isSequelizeMethod’的各个方面,并为您解答无法读取未定义的属性get的疑在这篇文章中,我们将为您介绍javascript – NodeJS Sequelize – 无法读取未定义的属性’_isSequelizeMethod’的相关知识,同时也会详细的解释无法读取未定义的属性get的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

javascript – NodeJS Sequelize – 无法读取未定义的属性’_isSequelizeMethod’(无法读取未定义的属性get)

javascript – NodeJS Sequelize – 无法读取未定义的属性’_isSequelizeMethod’(无法读取未定义的属性get)

我有一个使用Express的NodeJS服务器.
对于我的数据库,我使用Sequelize,我在Sequelize文档中定义了我的模型:

车型/ index.js

"use strict";

var fs        = require("fs");
var path      = require("path");
var Sequelize = require("sequelize");

var sequelize = new Sequelize(''mydb'', ''root'', '''', {
  host: ''localhost'',
  dialect: ''MysqL'',

  pool: {
    max: 5,
    min: 0,
    idle: 10000
  }
});
var db        = {};

fs
  .readdirsync(__dirname)
  .filter(function(file) {
    return (file.indexOf(".") !== 0) && (file !== "index.js");
  })
  .forEach(function(file) {
    var model = sequelize.import(path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(function(modelName) {
  if ("associate" in db[modelName]) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

车型/ server.js

"use strict";

module.exports = function(sequelize, DataTypes) {
  var Server = sequelize.define(''Server'', {
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        unique: true,
        allowNull: false
    },
    reference: DataTypes.STRING,
    name: DataTypes.STRING
  },
  {
    timestamps: false,
    paranoid: false,
    underscored: true,
    freezeTableName: true,
    tableName: ''server''
  });

  return Server;
};

车型/ subscriber.js

"use strict";

module.exports = function(sequelize, DataTypes) {
  var Subscriber = sequelize.define(''Subscriber'', {
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        unique: true,
        allowNull: false
    },
    type: {
      type: DataTypes.ENUM,
      values: [''email'', ''phone'']
    },
    contact: DataTypes.STRING,
    server_id: DataTypes.INTEGER,
    notified: DataTypes.INTEGER,
    last_notified: DataTypes.DATE
  },
  {
    timestamps: false,
    paranoid: false,
    underscored: true,
    freezeTableName: true,
    tableName: ''subscriber'',
    classMethods: {
      associate: function(models) {
        Subscriber.belongsTo(models.Server, { foreignKey: ''server_id'', targetKey: ''id'' });
      }
    }
  });

  return Subscriber;
};

在这里我的路线:

var models  = require(''../models'');

app.get(''/subscribe/:type/:contact/:ref'', function(req, res) {
        var type = req.params.type;
        var contact = req.params.contact;
        var ref = req.params.ref;

        models.Subscriber.findAll().then(function(result) {
            console.log(result);
        });

        res.render(''full/subscribed.twig'', {
            type: type,
            contact: contact,
            server : server
        });
    });

当我访问我的路线时,我有以下错误消息:

Unhandled rejection TypeError: Cannot read property ''_isSequelizeMethod'' of undefined
at /Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1077:20
at Array.map (native)
at Object.QueryGenerator.selectQuery (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1067:55)
at QueryInterface.select (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/query-interface.js:669:25)
at null.<anonymous> (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/model.js:1398:32)
at tryCatcher (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:510:31)
at Promise._settlePromise (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:567:18)
at Promise._settlePromise0 (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:612:10)
at Promise._settlePromises (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:691:18)
at Async._drainQueue (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:133:16)
at Async._drainQueues (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:143:10)
at Immediate.Async.drainQueues [as _onImmediate] (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:17:14)
at processImmediate [as _immediateCallback] (timers.js:383:17)

我尝试在一个独立的NodeJS文件上做一些经验,一切正常,我只是启动我的独立js文件,在数据库上有一些操作,一切正常.当我在Express路线上做同样的事情时,我有这个错误……

有人知道为什么?

提前致谢,
史蒂夫

解决方法:

我的上帝!我发现 !

这是因为我已经为Object原型添加了一些功能……

如果你的对象原型上有一些自定义函数,当sequelize获取模型的选项对象时,它会失败…

在node_modules / sequelize / lib / dialects / abstract / query-generator.js(第1067行)

mainAttributes = mainAttributes && mainAttributes.map(function(attr) {

mainAttributes包含我的自定义函数:

[ ''id'',
  ''reference'',
  ''name'',
  [ undefined, ''join'' ],
  [ undefined, ''getKeyByValue'' ] ]

我添加到Object的函数是join和getKeyByValue.

总而言之,当您使用Sequelize时,不要向Object.prototype添加自定义函数;)

希望它会帮助其他人.

史蒂夫

总结

以上是小编为你收集整理的javascript – NodeJS Sequelize – 无法读取未定义的属性’_isSequelizeMethod’全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

原文地址:https://codeday.me/bug/20190623/1266191.html

egg-sequelize --- nodejs

egg-sequelize --- nodejs

项目

egg + sequelize + mysql2


 

 

项目结构

 

配置


 

 

安装模块

npm install --save egg-sequelize

npm install --save egg-cors

npm install --save mysql2

 

config/pulgin.js

exports.sequelize = {
    enable: true,
    package: ''egg-sequelize'',
};
exports.cors = {
    enable: true,
    package: ''egg-cors'',
};

 

config/config.default.js

//mysql配置开始
   config.sequelize = {
    dialect: ''mysql'', // support: mysql, mariadb, postgres, mssql
    dialectOptions: {
      charset: ''utf8mb4'',
    },
    database: ''nodejs'',
    host: ''localhost'',
    port: ''3306'',
    username: ''root'',
    password: ''root'',
    timezone: ''+08:00'',
  };
  //mysql配置结束
  //cors配置开始
  config.security = {
    csrf: {
      enable: false,
    },
    domainWhiteList: [ ''http://localhost:8080'' ],
  };
  config.cors = {
    credentials: true,
  };
  //cors配置结束

 

数据建模


 

mysql 建表

CREATE TABLE `collect` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ''收藏id'',
  `author` varchar(255) DEFAULT NULL COMMENT ''作者'',
  `date` varchar(255) DEFAULT NULL COMMENT ''日期'',
  `link` varchar(255) DEFAULT NULL COMMENT ''链接'',
  `title` varchar(255) DEFAULT NULL COMMENT ''标题'',
  `created_at` datetime DEFAULT NULL COMMENT ''创建时间'',
  `updated_at` datetime DEFAULT NULL COMMENT ''更改时间'',
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=''收藏表'';

 

model/collect.js

''use strict'';
module.exports = app => {
    const {
        INTEGER,
        STRING,
        DATE
    } = app.Sequelize;
    const Collect = app.model.define(''collect'',{
        id:{
            type:INTEGER,
            primaryKey:true,
            autoIncrement:true
        },
        author:STRING,
        date:STRING,
        link:STRING,
        title:STRING,
        created_at:DATE,
        updated_at:DATE
    },{
        freezeTableName: true, //使用默认表名,不会变以collects
    })
    return Collect;
}

 

选配)启动时创建数据库表

// {work_dir}/app.js
module.exports = app => {
    app.beforeStart(async function () {
        await app.model.sync({ force: true });
    });
};

 

 

service


 

 

service/collect.js

 

''use strict'';

const Service = require(''egg'').Service;

class CollectService extends Service {

    // 查询所有数据
    async findAll() {
        let ret = await this.ctx.model.Collect.findAll()

        console.log(ret)
        return ret
    }

    // 增加数据
    async create(data) {
        await this.ctx.model.Collect.create(data)
        .then(res => {
            console.log(''res: ''+ JSON.stringify(res))
        }).catch(err => {
            console.log(''err: ''+ JSON.stringify(err))
        })

        // try{  
        //     let a= await this.ctx.model.Collect.create(data)
        //     console.log(a)
        // }catch(err){
        //     console.log(err)
        // }
    }

    // 修改数据
    async update() {
        const ret = await this.ctx.model.Collect.update({
            author: ''新作者''
        }, {
            where: {
                id: 2
            }
        }).then(ok => {
            console.log(''ok'')
            console.log(ok)
        }).catch(e => {
            console.log(''message:'' + e)
        })
    }

    // 删除数据
    async delete(callback){
        await this.ctx.model.Collect.destroy({
            where: {
                id: 20
            }
        }).then(res => {
            console.log(''res:'' + JSON.stringify(res))
            return callback(JSON.stringify(res))
        })

    }


    // 自定义查询
    async query(callback){
        let sql = ''SELECT COUNT(1) FROM collect''
        let ret = await this.ctx.model.query(sql, {type: ''SELECT''})
        return ret
    }
}

module.exports = CollectService;

 

 

 

 

controller


 

 

controller/collect.js

''use strict'';

const Controller = require(''egg'').Controller;

class CollectController extends Controller {
    async findAll(){
        const {ctx} = this;
        ctx.body = await ctx.service.collect.findAll()
    }

    async create(){
        const ctx = this.ctx
        const body = ctx.request.body

        const ret = await ctx.service.collect.create(body)

        ctx.body = ''<h1>添加数据</h1>''
    }

    async update() {
         await this.ctx.service.collect.update()
        this.ctx.body = ''<h1>修改数据</h1>''
    }

    async delete() {
        await this.ctx.service.collect.delete(function(res, err) {
            console.log(''ret: '' + res)
        })
        console.log(''哈哈哈哈'')
        this.ctx.body = ''<h1>删除数据</h1>''
    }
}

module.exports = CollectController;

 

 

router.js


 

 

router.get(''/collect'',controller.collect.findAll)
  router.post(''/create'', controller.collect.create)
  router.get(''/update'', controller.collect.update)
  router.get(''/delete'', controller.collect.delete)

 

 

接下来,用postman 或者 其他测试软件自己跑一下...

 

 

 

 

 

 

javascript – Ext JS动态存储插入无法读取未定义的属性’isModel’

javascript – Ext JS动态存储插入无法读取未定义的属性’isModel’

我从模型关系动态创建我的商店并将此商店附加到网格.

var map = record.getCommunity().mappings();

map.load({
    url: '/myUrl/mappings',scope: this,callback: function(records,operation,success) {

        map.group('type');

        //ExtJS bug https://www.sencha.com/forum/showthread.PHP?265674

        me.getoutgoingGrid().destroy();

        childGrid = Ext.create('hds.view.outgoingGrid',{
            store: map
        });
        me.getGridHolder().add(childGrid);
        me.getoutgoingGrid().getSelectionModel().select(0,false) ;
    }
});

当我想创建一个新的模型实例并将其插入此动态存储时,我收到以下错误:

Cannot read property 'isModel' of undefined

以下是触发错误的代码:

var newMap = Ext.create('hds.model.MappingModel',{
    indetifier  : "something",});

me.getoutgoingGrid().store.insert(0,newMap);

我找不到这个问题的原因….任何想法?

解决方法

很难知道是什么破坏了你的代码,但这里有几件事:

1 – 您需要在类原型中定义模型标识符,而不是在实例中.

2 – 你拼写错误的标识符

所以你的模型应该是这样的:

Ext.define('hds.model.MappingModel',{
    identifier  : "something",});

var newMap = new hds.model.MappingModel({
    //...your config here
});

您看到的错误当存储尝试检查model是否是Ext.data.Model的实例但未传递的模型未定义时,将抛出无法读取属性’isModel’的undefined.
这可能由于多种原因而发生,但通常是因为您在定义原型之前尝试创建模型,或者因为代码中存在拼写错误.

请尝试创建一个小提琴(https://fiddle.sencha.com)重现此错误,否则将很难帮助您.

问候,

javascript – Node.js / Sequelize.js / Express.js – 如何插入多对多关联? (同步/异步?)

javascript – Node.js / Sequelize.js / Express.js – 如何插入多对多关联? (同步/异步?)

我有两个模型(个人,电子邮件),我试图使用Sequelize命令插入创建的’Individual_Email’表.虽然Sequelize正在创建所需的表,但在尝试向/从该表添加/ get / set时会返回以下错误:“Object [object Promise]没有方法’addEmail’”.我错过了什么?

Sequelize文档说如果模型是User和Project,“这将把方法getUsers,setUsers,addUsers添加到Project,getProjects,setProjects和addProject添加到User.”

这让我相信(看看承诺)我可能误解了如何使用Node的异步功能.我已经尝试了同步和异步版本的插入,两者都返回上面相同的消息.

Sequelize文档:http://docs.sequelizejs.com/en/latest/docs/associations/

码:

路线/ index.js

var express = require('express');
var router = express.Router();
var models  = require('../models');

/* GET home page. */
router.get('/',function(req,res,next) {
    'use strict';

    var tIndividual,tEmail;
    tIndividual = models.Individual.create({
        name: "Test"
    });
    tEmail = models.Email.create({
        address: "test@gmail.com"
    });
    console.log(tEmail);

    res.render('index',{ title: 'Express' });
});

module.exports = router;

要么

/* GET home page. */
router.get('/',tEmail;    
    tIndividual = models.Individual.create({
        name: "Test"
    }).then(function(){
        tEmail = models.Email.create({
            address: "test@gmail.com"
        }).then(function(){
            tIndividual.addEmail(tEmail).then(function(){
                console.log("Success");
            });
        })
    });

    res.render('index',{ title: 'Express' });
});

module.exports = router;

车型/ index.js

db.Individual.hasMany(db.Email,{
    as: 'Email',through: 'Individual_Email'
});
db.Email.hasMany(db.Individual,{
    as: 'Individual',through: 'Individual_Email'
});

如何以最佳方式添加到表’Individual_Email’?我假设我需要同步地等待更新,但我愿意接受任何建议.谢谢!

解决方法

当你调用.save()或.create()或其他返回Promise的方法时,你应该在该promise上调用.then().当它结算时 – 也就是说,当对象被保存/创建/某事被删除时 – 将调用你的函数,并将接收保存/创建的对象作为参数.

所以你的第一次尝试可以改写为:

models.Individual.create({
  name: "Test"
}).then(function(createdindividual) { // note the argument
  models.Email.create({
    address: "test@gmail.com"
  }).then(function(createdEmail) { // note the argument
    createdindividual.addEmail(createdEmail)
      .then(function(addedEmail) { // note th-- well you get the idea :)
        console.log("Success");
      });
  })
});

上面的代码缺少一些重要的东西,比如返回promises以获得更好的链接和错误处理,但这是一个开始.我建议Bluebird’s documentation(这是Sequelize使用的Promise库,但还有其他几个)

javascript – Sequelize classMethods vs instanceMethods

javascript – Sequelize classMethods vs instanceMethods

所以开始我的冒险进入所有的东西Node.我试图学习的其中一个工具是Sequelize.所以我会从我想做的事开始:
'use strict';
var crypto = require('crypto');

module.exports = function(sequelize,DataTypes) {
  var User = sequelize.define('User',{
    username: DataTypes.STRING,first_name: DataTypes.STRING,last_name: DataTypes.STRING,salt: DataTypes.STRING,hashed_pwd: DataTypes.STRING
  },{
    classMethods: {

    },instanceMethods: {
      createSalt: function() {
        return crypto.randomBytes(128).toString('base64');
      },hashPassword: function(salt,pwd) {
        var hmac = crypto.createHmac('sha1',salt);

        return hmac.update(pwd).digest('hex');
      },authenticate: function(passwordToMatch) {
        return this.hashPassword(this.salt,passwordToMatch) === this.hashed_pwd;
      }
    }
  });
  return User;
};

我在使用classMethods vs instanceMethods时感到困惑.对我来说,当我想到createSalt()和hashPassword()应该是类的方法.他们是一般的,在很大程度上与他们一般使用的具体实例没有任何关系.但是当我在classMethods中有createSalt()和hashPassword()时,我无法从instanceMethods调用它们.

我已经尝试过以下变体:

this.createSalt();
this.classMethods.createSalt();
createSalt();

像下面的东西不会工作,我可能只是不了解一些简单的东西.

authenticate: function(passwordToMatch) {
  console.log(this.createSalt());
  return this.hashPassword(this.salt,passwordToMatch) === this.hashed_pwd;
}

任何提示/提示/方向将非常感谢!

解决方法

所有不修改或检查任何类型的实例的方法应该是classMethod和其余的instanceMethod

例如:

//should be a classMethods
function getMyFriends() {
  return this.find({where{...}})
}

//should be a instanceMethods
function checkMyName() {
  return this.name === "george";
}

关于javascript – NodeJS Sequelize – 无法读取未定义的属性’_isSequelizeMethod’无法读取未定义的属性get的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于egg-sequelize --- nodejs、javascript – Ext JS动态存储插入无法读取未定义的属性’isModel’、javascript – Node.js / Sequelize.js / Express.js – 如何插入多对多关联? (同步/异步?)、javascript – Sequelize classMethods vs instanceMethods等相关内容,可以在本站寻找。

本文标签: