续集实例方法

Zol*_*ola 1 node.js underscore.js sequelize.js

我正在尝试配置我的数据库,我希望返回给用户的数据不包含一些有意义的数据,所以我添加了一个名为toPublicJSONinstanceMethods,它使用一个名为pick from underscoreJS的函数,但是当我使用这个函数(toPublicJSON ) 我遇到一个错误:toPublicJSON不是一个函数

这是我的数据库配置:

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

module.exports = function(sequelize, DataType) {
    return sequelize.define('users', {
        email: {
            type: DataType.STRING,
            allowNull: false,
            unique: true,
            validate: {
                isEmail: true

            }
        },
        salt: {
            type: DataType.STRING
        },
        hassedPassword: {
            type: DataType.STRING
        },
        password: {
            type: DataType.VIRTUAL,
            allowNull: false,
            validate: {
                len: [7, 100]
            },
            set: function(value) {
                var salt = bcrypt.genSaltSync(10);
                var hashed_password = bcrypt.hashSync(value, salt);
                this.setDataValue('password', value);
                this.setDataValue("salt", salt);
                this.setDataValue("hassedPassword", hashed_password);

            }
        }
    }, {
        hooks: {
            beforeValidate: function(user, option) {
                if (typeof user.email == 'string')
                    user.email = user.email.toLowerCase();
            }
        },

        instanceMethods:{
            toPublicJSON: function() {
                var json = this.toJSON();
                return _.pick(json, 'id', 'email', 'createdAt', 'updatedAt');

            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我的代码:

app.post('/users',function(req,res){
    var body=_.pick(req.body,"email","password");
    db.users.create(body).then(function(user){
        return res.send(user.toPublicJSON());
    },function(e){
        return res.status(400).json(e);
    })

});
Run Code Online (Sandbox Code Playgroud)

这是错误:

在此处输入图片说明

Dyl*_*den 5

假设您使用的是最新版本的 Sequelize,他们稍微改变了如何定义实例和类方法。您需要将函数分配给 的结果的原型sequelize.define('users');。您需要将结果保存sequelize.define到一个变量中,类似于下面...

const User = sequelize.define('users', {});
User.prototype.toPublicJSON = function() {
  // Your code here
};
return User;
Run Code Online (Sandbox Code Playgroud)

如果您使用的是第 3 版,请告诉我。

祝你好运 :)

编辑:进一步阅读材料http://docs.sequelizejs.com/manual/tutorial/models-definition.html#expansion-of-models

编辑 2:您可能想要查看范围。它们本质上是预烘焙的过滤器,您可以在查询它们时应用于数据。http://docs.sequelizejs.com/manual/tutorial/scopes.html

如果你这样做了,那么你可以说

sequelize.define('users', {
  // Attributes...
}, {
  scopes: {
    public: {
      attributes: ['id', 'email', 'createdAt', 'updatedAt']
    }
  }
});

db.users.scope('public').findOne({...});
Run Code Online (Sandbox Code Playgroud)