2017-09-29 14 views
0

NodeJS & Expressでtodolist apiプロジェクトをコーディングしました。 Sequelizeを使用してDB:SQLiteとやりとりする指示に従います。Sequelize v4のエラー

user.jsの

var bcrypt = require('bcrypt'); 
var _ = require('underscore'); 

module.exports = (sequelize, DataTypes) => { 
var User = sequelize.define('user', { 
    email: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     unique: true, 
     validate: { 
      isEmail: true 
     } 
    }, 
    salt: { 
     type: DataTypes.STRING 
    }, 
    password_hash: { 
     type: DataTypes.STRING 
    }, 
    password: { 
     type: DataTypes.VIRTUAL, 
     allowNull: false, 
     validate: { 
      len: [6, 100] 
     }, 
     set: function (value) { 
      var salt = bcrypt.genSaltSync(10); 
      var hashedPassword = bcrypt.hashSync(value, salt); 

      this.setDataValue('password', value); 
      this.setDataValue('salt', salt); 
      this.setDataValue('password_hash', hashedPassword); 
     } 
    } 
}, { 
    hooks: { 
     beforeValidate: (user, options) => { 
      if (typeof user.email === 'string') { 
       user.email = user.email.toLowerCase(); 
      } 
     } 
    } 
}); 
return User; 

// Class methods 
User.prototype.toPublicJSON = function() { 
    var json = this.toJSON(); 
    return _.pick(json, 'id', 'email', 'createdAt', 'updatedAt'); 
}; 

User.authenticate = (body) => { 
    return new Promise ((resolve, reject) => { 
     if (typeof body.email !== 'string' || typeof body.password !== 'string') { 
      return reject(); 
     } 

     user.findOne({ 
      where: { 
       email: body.email 
      } 
     }).then((user) => { 
      if (!user || !bcrypt.compareSync(body.password, user.get('password_hash'))) { 
       return reject(); 
      } 

      resolve(user); 
     }, (e) => { 
      reject(); 
     }) 
    }); 
}; 
} 

db.js

var Sequelize = require('sequelize'); 

var sequelize = new Sequelize(undefined, undefined, undefined, { 
    'dialect': 'sqlite', 
    'storage': __dirname + '/data/dev-todo-api.sqlite' 
}); 

db = {}; 

db.todo = sequelize.import(__dirname + '/models/todo.js'); 
db.user = sequelize.import(__dirname + '/models/user.js'); 
db.sequelize = sequelize; 
db.Sequelize = Sequelize; 

module.exports = db; 

user.jsの

app.post('/users/login', (req, res) => { 
    var body = _.pick(req.body, 'email', 'password'); 

    db.user.authenticate(body).then((user) => { 
    res.json(user.toPublicJSON()); 
    },() => { 
    res.status(401).send(); 
    }); 
}) 
:しかし、私は以下のようにクラスメソッドを作成するためにSequelizeと遭遇します

エラー:db.user.authenticateは機能しません。

user.jsが変数Userを返した後に関数認証を使用できると思います。この問題の解決方法を教えてください。皆さんありがとう。

答えて

1

問題はsequelizeではありません。代わりに、戻り値の後にメソッドを定義するので、メソッドを作成するコードには決して到達しません。

return User; 

// Class methods 
User.prototype.toPublicJSON = function() { 
    var json = this.toJSON(); 
    return _.pick(json, 'id', 'email', 'createdAt', 'updatedAt'); 
}; 

User.authenticate = (body) => { 

あなたの矢印関数の最後にreturn User文を移動する必要がありますし、あなたのコードは動作するはずです。

+0

親愛なるshawon191、私はあなたが示唆するように私のコードを変更するが、それは常にステータス(401)を返す(私は正しいデータを与える)。私は以下のように間違いを発見します: user.findOne({})==> User.findOne({})。すべては今大丈夫です。あなたの貢献には本当に感謝をしている。 –