【问题标题】:TypeError: Cannot read property 'find' of undefined from sequelize modelTypeError:无法从续集模型中读取未定义的属性“查找”
【发布时间】:2017-04-04 02:23:57
【问题描述】:

我正在尝试使用 sequelize 在我的数据库中查找记录,但我得到了这个:

.find({ where: { name: email } })
TypeError: Cannot read property 'find' of undefined

这是我的模型/index.js

var Sequelize = require('sequelize')
  , sequelize = new Sequelize(process.env.MYSQL_DB, process.env.MYSQL_USER, process.env.MYSQL_PASSWORD, {
      dialect: "mysql", // or 'sqlite', 'postgres', 'mariadb'
      port:    3306, // or 5432 (for postgres)
});

// load models                 
var models = [                 
  'user',            
];

models.forEach(function(model) {
  module.exports[model] = sequelize.import(__dirname + '/' + model);
});

这是我的模型/user.js

var Sequelize = require("sequelize");

module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define("User", {
    email: DataTypes.STRING,
    password: DataTypes.STRING,
    token: DataTypes.STRING
  }, {
    tableName: 'users'
  }

  );

  return User;
};

这就是我在文件中导入用户模型的方式:

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

编辑

我正在尝试使用用户创建带有本地护照的注册。 我在 config/passport.js 中调用用户

var LocalStrategy = require('passport-local').Strategy;
var SlackStrategy = require('passport-slack').Strategy;
var User  = require('../models').User;
var mysql = require('mysql');
var connection = mysql.createConnection({
  host     : process.env.MYSQL_HOST,
  user     : process.env.MYSQL_USER,
  password : process.env.MYSQL_PASSWORD,
  database : process.env.MYSQL_DB
});

module.exports = function(passport) {
    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        console.log("abc serializeUser");
        console.log(user);
        done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
        console.log("abc deserializeUser");
        User.findById(id).then(function(user){
            done(null, user);
        }).catch(function(e){
            done(e, false);
        });
    });

    passport.use('local-signup', new LocalStrategy(
        {
            // by default, local strategy uses username and password, we will override with email
            usernameField : 'name',
            passwordField : 'password',
            passReqToCallback : true // allows us to pass back the entire request to the callback
        },

        function(req, email, password, done) 
        {

            process.nextTick(function() {

                User
                    .find({ where: { name: email } })
                    .then(function(err, user) {
                        if (!user) {
                          console.log('No user with the username "john-doe" has been found.');
                        } else {
                          console.log('Hello ' + user.name + '!');
                          console.log('All attributes of john:', user.get());
                        }
                    });


        }           
    ));


    passport.use('slack', new SlackStrategy({
        clientID: process.env.SLACK_ID,
        clientSecret: process.env.SLACK_SECRET,
        scope: "users:write"
    },
        function(accessToken, refreshToken, profile, done) {
            User.findOrCreate({ SlackId: profile.id }, function (err, user) {
              return done(err, user);
            });
        }
    ));

};

【问题讨论】:

  • 您能否展示更多关于.find 的代码,例如您在什么对象上使用它以及如何获取该对象?
  • @dinchev 我编辑了这个问题。可以查一下吗?

标签: node.js express sequelize.js


【解决方案1】:

你应该在import sequelize 方法完成工作后获得你的User 模型。

所以在你的情况下你应该这样做:

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

这应该可行。

【讨论】:

  • 谢谢,错误消失了,但是注册表还不能用
  • 你应该问另一个问题。很难理解,因为没有错误等。
【解决方案2】:

您可以在一个文件中定义/初始化您的模型及其关系,但在单独的模型文件中描述模型。

index.ts

import { TableNames } from '../constants';
import { groupAttributes, GroupModel, groupOptions } from './group.model';
import { userAttributes, UserModel, userModelOptions } from './user.model';

GroupModel.init(groupAttributes, groupOptions);
UserModel.init(userAttributes, userModelOptions);

GroupModel.belongsToMany(UserModel, { through: TableNames.USER_GROUPS });
UserModel.belongsToMany(GroupModel, { through: TableNames.USER_GROUPS });

所有模型详细信息,如 groupAttributes 和 groupOptions 进入不同的文件:

group.model.ts

import { DataTypes, Model } from 'sequelize';
import { TableNames } from '../constants';
import { sequelizeConnection } from '../connection';
import { GroupPermission } from '../../entities/group';

export class GroupModel extends Model {
  public id!: string;
  public name!: string;
  public permissions!: GroupPermission[];
}

export const groupAttributes = {
  id: {
    type: DataTypes.UUID,
    primaryKey: true,
  },
  name: {
    type: new DataTypes.STRING(255),
    allowNull: false,
  },
  permissions: {
    type: DataTypes.ARRAY(DataTypes.STRING),
    allowNull: true,
  },
};

export const groupOptions = {
  tableName: TableNames.GROUPS,
  sequelize: sequelizeConnection,
  freezeTableName: true,
  timestamps: false,
  modelName: 'Group',
};

这里的关键是init 模型在您设置关系的同一文件中

【讨论】:

  • 这完全解决了我的问题,同时保持我的代码分离和干净+1
猜你喜欢
  • 2020-01-23
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 1970-01-01
  • 2017-11-02
  • 2021-11-20
相关资源
最近更新 更多