避免在Sequelize,Nodejs和Reactjs中重复?



我使用

与<<ol>
  • nodejs/gh>
  • sequelize
  • reactjs
  • **,问题是如何避免重复序列化,我有一个注册表如下

    fullName
    emad_address
    password
    

    和我不想有重复的电子邮件和fullName:代码如下:

    module.exports = (sequelize, DataTypes) => {
    const Users = sequelize.define("Users", {
    fullName: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    emailAddress: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    password: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    });
    

    ,这是路由器:

    router.post("/", async (req, res) => {
    const { fullName, emailAddress, password } = req.body;
    bcrypt.hash(password, 10).then((hash) => {
    Users.create({
    fullName: fullName,
    emailAddress: emailAddress,
    password: hash,
    });
    res.json("User, Success");
    });
    });
    

    任何建议吗?

    您需要在DB级别上添加唯一的约束,并在创建时处理SequelizeUniqueConstraintError以返回验证消息给用户

    如果您使用sequelize.sync()在DB模式上应用模型更改,那么您可以这样定义约束:

    module.exports = (sequelize, DataTypes) => {
    const Users = sequelize.define('Users', {
    fullName: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true // unique constrain of the column `fullName`
    },
    emailAddress: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true // unique constrain of the column `emailAddress`
    },
    password: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    }, {
    // define constrain like this if you need combination of columns unique
    // indexes: [
    //   {
    //     unique: true,
    //     fields: ['fullName', 'emailAddress']
    //   }
    // ]
    });
    return Users;
    };
    

    如果您使用迁移创建DB模式,您可以创建这样的约束:

    module.exports = {
    up: async (queryInterface, Sequelize) => {
    await queryInterface.addColumn('Users', 'fullName', {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true // unique constrain of the column `fullName`
    });
    await queryInterface.addColumn('Users', 'emailAddress', {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true // unique constrain of the column `emailAddress `
    });
    // define constrain like this if you need combination of columns unique
    // return queryInterface.addConstraint('Users', ['fullName', 'emailAddress'], {
    //   'type': 'unique',
    //   'name': 'UK_Users_fullName_emailAddress'
    // })
    },
    down: async (queryInterface, Sequelize) => {
    await queryInterface.removeColumn('Users', 'emailAddress');
    await queryInterface.removeColumn('Users', 'fullName');
    // return queryInterface.removeConstraint('Users', 'UK_Users_fullName_emailAddress')
    }
    }
    

    所以在这种方法中,DB永远不会让你添加重复的条目。

    Update # 1

    如果我没弄错的话,你的代码片段是一个express router。如果存在,则需要检查是否存在带有email或fullName的用户,如sequelize:

    router.post("/", async (req, res) => {
    const { fullName, emailAddress, password } = req.body;
    const user = await Users.findOne({ fullName, emailAddress });
    if (!user) {
    res.status(400).send({ error: "This email is in use by someone els, please try something else, thanks." });
    } else {
    bcrypt.hash(password, 10).then((hash) => {
    Users.create({
    fullName: fullName,
    emailAddress: emailAddress,
    password: hash,
    });
    res.json("User, Success");
    });
    }
    });
    

    可以从router.post开始。通过查询数据库来检查是否存在一个用户,如果存在则抛出一个错误,说该用户已经在这里。

    这是我尝试过的

    router.post("/", async (req, res) => {
    const { fullName, emailAddress, password } = req.body;
    if (fullName && emailAddress) {
    console.log(
    "This email is in use by someone els, please try something else, thanks."
    );
    } else {
    bcrypt.hash(password, 10).then((hash) => {
    Users.create({
    fullName: fullName,
    emailAddress: emailAddress,
    password: hash,
    });
    res.json("User, Success");
    });
    }
    });
    

    现在它正在工作,但我需要在UI中为用户显示一些消息。

    最新更新