Пользовательская функция Sequelize модели не может быть вызвана из контроллера - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть модель сиквела, эта пользовательская функция работает следующим образом:

'use strict';
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const config = require('../../config');

module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {
id: {
  type: DataTypes.STRING,
  primaryKey: true
},
name: DataTypes.STRING,
email: DataTypes.STRING,
bio: DataTypes.STRING,
phone: DataTypes.STRING,
username: DataTypes.STRING,
password: {
  type: DataTypes.STRING,
  set(value){
    this.setDataValue('password', bcrypt.hashSync(value, 10));
  }
}
}, {});

User.generateJWT = function(id, username) {
return jwt.sign({
  id: id,
  username: username,
  expiresIn: config.auth.exp
}, config.secret);
};

User.toAuthJson = async function() {
return {
  name: this.name,
  email: this.email,
  bio: this.bio,
  phone: this.phone,
  username: this.username
};
};

User.validatePassword = function(password, passwordHash){
return bcrypt.compareSync(password, passwordHash);
};

User.isUniqueEmail = async function(email) {
  return await User.findOne({where: {email}}) === null;
};

User.isUniqueUsername = async function(username) {
  return await User.findOne({where: {username}}) === null;
};

User.isUniquePhone = async function(phone) {
 return await User.findOne({where: {phone}}) === null;
};
User.associate = function(models) {
// associations can be defined here
};
return User;
};

и контроллер выглядит так:

const {User} = require('../database/models/');

module.exports.register = async (req, res, next) => {
    try {
       const isUniqueEmail = await User.isUniqueEmail(req.body.email);
        if (!isUniqueEmail) return  res.status(422).json({'message': 'email already exists'});

        const isUniquePhone = await User.isUniquePhone(req.body.phone);
        if (!isUniquePhone) return  res.status(422).json({'message': 'phone already exists'});

        const isUniqueUsername = await User.isUniqueUsername(req.body.username);
        if (!isUniqueUsername) return  res.status(422).json({'message': 'username already exists'});

         const user = await User.create(req.body);
         console.log(user.toAuthJson()); //an error occurs here
        return res.status(201).json({user: user.toAuthJson()});
    }catch (e) {
        next(e);
    }
 };

, когда я пытаюсь получить доступ к функции toAuth Json из этот контроллер, как этот user.toAuth Json. "обратите внимание на маленькую". выдает ошибку TypeError: User.toAuth Json не является функцией. Я должен иметь возможность получить к нему доступ нормально. Помогите. спасибо

1 Ответ

0 голосов
/ 02 февраля 2020

User.toAuthJson в настоящее время является методом класса. Как и в случае с другими функциями, вам нужно будет вызывать его следующим образом: User.toAuthJson(user).

Вы, вероятно, ищете метод экземпляра, поэтому вместо него вы хотите определить его в прототипе:

User.prototype.toAuthJson = function() {
  return {
    name: this.name,
    email: this.email,
    bio: this.bio,
    phone: this.phone,
    username: this.username
  };
};

Теперь вы можете вызывать его для экземпляра User, как вы пытались это сделать:

console.log(user.toAuthJson());

Обратите внимание, что я пропустил async, так как эта функция не работает ничего асинхронного.

...