продолжить ввод данных

#node.js #postgresql #sequelize.js

#node.js #postgresql #sequelize.js

Вопрос:

В моем приложении node я использую sequelize в качестве ORM для моей базы данных postgresql.Ниже приведена моя модель:

Пользователь:

 var bcrypt = require('bcrypt'),
    crypto = require('crypto');

var authTypes = ['github', 'twitter', 'facebook', 'google'];

var map_attributes = function() {
    var obj = new Object(),
        ctx = this;
    ctx.attributes.forEach(

    function(attr) {
        obj[attr] = ctx[attr];
    });
    return obj;
};

var validatePresenceOf = function(value) {
    return value amp;amp; value.length;
};

module.exports = function(sequelize, DataTypes) {
    return sequelize.define('user', {
        name: {
            type: DataTypes.STRING,
            validate: {
                len: {
                    args: 1,
                    msg: "Name cannot be blank"
                }
            }
        },
        email: {
            type: DataTypes.STRING,
            validate: {
                len: {
                    args: 1,
                    msg: "email cannot be blank"
                }
            }
        },
        username: {
            type: DataTypes.STRING,
            validate: {
                len: {
                    args: 1,
                    msg: "username cannot be blank"
                }
            }
        },
        provider: DataTypes.STRING,
        //hashed_password: String,
        hashed_password: {
            type: DataTypes.STRING,
            set: function(v) {
                var salt = bcrypt.genSaltSync(10);
                var hash = bcrypt.hashSync(v, salt);
                this.setDataValue('hashed_password', hash);
            }
        },
        salt: DataTypes.STRING,
        /*facebook: {},
    twitter: {},
    github: {},
    google: {}*/
    }, {
        hooks: {
            beforeValidate: function(next) {
                if (!this.isNew) return next();
                if (!validatePresenceOf(this.password) amp;amp; authTypes.indexOf(this.provider) === -1) next(new Error('Invalid password'));
                else next();
            }
        }
    }, {
        instanceMethods: {
            authenticate: function(plainText) {
                return this.encryptPassword(plainText) === this.hashed_password;
            },
            makeSalt: function() {
                return Math.round((new Date().valueOf() * Math.random()))   '';
            },
            encryptPassword: function(password) {
                if (!password) return '';
                return crypto.createHmac('sha1', this.salt).update(password).digest('hex');
            }
        }
    });

}
  

В этой модели я должен вставлять данные в свою базу данных.Как я могу этого добиться. Я нашел этот учебник http://sequelizejs.com/docs/1.7.8/instances но это отличается от моего дизайна, здесь я экспортирую полную модель.Заранее спасибо.

Я пытался для этого:

index.js:

 var Sequelize = require('sequelize');
var util = require('util');
var config = require('config').dbpostgres; // we use node-config to handle environments

// initialize database connection
var sequelize = new Sequelize(
config.dbname,
config.username,
config.password, {
    dialect: 'postgres'
});

//var sequelize = new Sequelize('postgres://postgres:postgres@localhost:5432/Geocode', { dialect: 'postgres', protocol: 'postgres' });

// load models
var models = ['user'] //,'sciSphereModel', 'access_token', 'oauth_client', 'request_token', 'article'];

models.forEach(function(model) {
    //console.log(model)
    var sequelizeModel = sequelize.import(__dirname   '/'   model);
    //console.log("seq="   util.inspect(sequelizeModel));
    //sequelizeModel.sync();
    /*sequelizeModel.sync().success(function() {
            console.log('DB error');
        }).error(function(error) {
            console.log(error);
        })*/

    sequelizeModel.sync();

    //console.log("sequelizeModel="   util.inspect(sequelizeModel))
    var user = sequelizeModel.build({
        name: 'kumar',
        email: 'kumar@gmail.com',
        username: 'kumar007',
        provider: 'local',
        hashed_password: 'tyegnaak',
        salt: 'uopioann'
    })


    user.save().complete(function(err) {
        console.log("Inside user save");
        if ( !! err) {
            console.log('The instance has not been saved:', err)
        }
        else {
            console.log('We have a persisted instance now')
        }
    })
    module.exports[model] = sequelizeModel; //Implement sync
});
// export connection
//sequelize.sync();
module.exports.sequelize = sequelize;
app.set('sequelize', sequelize);
  

Правильно ли я поступаю?.Можно ли таким образом добиться этого?

Ответ №1:

Не было бы sequelize.sync(); не sequelizeModel.sync(); потому что вы хотели бы синхронизировать любые изменения модели с БД. Вы также можете усилить синхронизацию в случае, если таблица не соответствует вашей модели.

sequelize.sync({ force: true }); // use to drop before create

Я никогда не пробовал синхронизировать на модели, просто create() , save() , find() updateAttributes() и т.д.