我使用
与<<ol>**,问题是如何避免重复序列化,我有一个注册表如下
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中为用户显示一些消息。