javascript - Sequelize v4 出错

标签 javascript node.js sequelize.js

我刚刚在 NodeJS 和 Express 上编写了 todolist api 项目。我遵循一些使用 Sequelize 与 DB: SQLite 交互的说明。但我遇到 Sequelize 创建类方法如下:

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();
  });
})

错误:db.user.authenticate 不起作用。

我想我可以在 user.js 返回变量 User 后使用函数authenticate。请告诉我如何解决这个问题。谢谢大家。

最佳答案

问题不在于 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 语句移到箭头函数的末尾,这样您的代码就应该可以工作。

关于javascript - Sequelize v4 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46484891/

相关文章:

sql - 使用 Sequelize 即时创建新表

node.js - Sequelize 不从 .env 文件中获取主机名并默认为机器的 IP 地址

javascript - 如何使用 asp.net mvc 和 jquery 在成功时在 ajax 警报中渲染 html

javascript - 类型错误 : Attempted to assign to readonly property - when typing in a text field

javascript - 设计一款集换式纸牌游戏

javascript - NodeJS 和 Express - 分离我的 Controller 和模型

javascript - 为什么 __proto__ 是相同的

node.js - Bookshelf.js 注册表 [错误 : The model . .. 无法从注册表插件解析。]

node.js - 如何在 Node 中管理第 3 方库的已修复但尚未拉取的版本?

orm - sequelizejs 中的 instanceMethods 和 getterMethods 有什么区别?