Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Sequelize v4出现错误_Javascript_Node.js_Sequelize.js - Fatal编程技术网

Javascript Sequelize v4出现错误

Javascript Sequelize v4出现错误,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,我刚刚在NodeJS&Express上编写了todolistapi项目。我按照一些说明使用Sequelize与DB:SQLite交互。但我遇到了Sequelize创建类方法,如下所示: user.js var bcrypt = require('bcrypt'); var _ = require('underscore'); module.exports = (sequelize, DataTypes) => { var User = sequelize.define('user', {

我刚刚在NodeJS&Express上编写了todolistapi项目。我按照一些说明使用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();
        })
    });
};
}
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;
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.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();
        })
    });
};
}
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;
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();
  });
})
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();
        })
    });
};
}
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;
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。请告诉我如何解决这个问题。谢谢大家。

问题不在于续集。相反,您是在返回后定义方法,因此永远不会到达负责创建方法的代码

return User;

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

User.authenticate = (body) => {

您应该移动箭头函数末尾的
return User
语句,您的代码应该可以工作。

亲爱的shawon191,我按照您的建议更改了代码,但它总是返回状态(401)(我给出了正确的数据)。我检测到我犯了如下错误:user.findOne({})==>user.findOne({})。现在一切都好了。非常感谢你的支持。