我不知道我錯過了什么,但在塊中捕獲 session.abortTransaction() 沒有滾動任何東西。我故意在創建用戶后使用 throw new Error("Error message") 登陸 catch 塊以觸發 session.abortTransaction() 但是當我查看資料庫時,我發現盡管流產,用戶仍然被創建.
這是我的源代碼
export const signUp = async (req, res) => {
const { email, password, fullname } = req.body;
// Init session
const session = await mongoose.startSession();
// Begin transaction
session.startTransaction();
try {
// Check if user exist in database using his email
const dbUser = await UserModel.findOne({ email }, null, session);
// Return a conflit code if user already exist
if (dbUser) return res.status(409).json({ message: "User already exists" });
// Create tenant
const tenantResult = await TenantModel.create([{ createdAt: new Date() }], null, session);
// Get admin role
const roleResult = await RoleModel.findById('626db17b8645717d657fc4c8', null, session);
//Hash password using jwt
const hashedPassword = await bcrypt.hash(password, 12);
// Store user in db
const userResult = await UserModel.create([
{
email: email,
password: hashedPassword,
fullname: fullname,
tenant: tenantResult[0],
role: roleResult
}
], null, session);
throw new Error("Error message");
if (userResult){
// Create subscription && currency
// Create currency for user
await CurrencyModel.create([
{
name: 'Dollar',
createdAt: new Date(),
symbol: '$',
isoCode: 'USD',
default: true,
userRole: 'setting-list',
createdBy: userResult[0],
}
], null, session);
}
// Generate token using jwt, secret, and user data
const token = jwt.sign( { email: userResult[0].email, id: userResult[0]._id }, secret, { expiresIn: "24h" } );
// Send welcome email to registered user
await sendWelcomeEmail(userResult[0].email, userResult[0].fullname, `Welcome ${userResult[0].fullname} - light-speed.dev`, 'welcome-email.html');
//Commit transaction
await session.commitTransaction();
// Return 201 Created http code with user and token
return res.status(201).json({ userResult, token });
} catch (error) {
// Abort transaction if one of these request throw error
await session.abortTransaction();
console.log(error);
return res.status(400).json({ message: 'Something went wrong!' });
} finally {
// close session
session.endSession();
}
};
謝謝您的幫助!
uj5u.com熱心網友回復:
我終于弄清楚了為什么會話不回滾事務。這是因為我指定會話選項的方式。
我改變這些行
const dbUser = await UserModel.findOne({ email }).session(session);
const tenantResult = await TenantModel.create([{ createdAt: new Date() }], { session: session });
const roleResult = await RoleModel.findById('626db17b8645717d657fc4c8').session(session);
const userResult = await UserModel.create([
{
email: email,
password: hashedPassword,
fullname: fullname,
tenant: tenantResult[0],
role: roleResult
}
], { session: session });
await CurrencyModel.create([
{
name: 'Dollar',
createdAt: new Date(),
symbol: '$',
isoCode: 'USD',
default: true,
userRole: 'setting-list',
createdBy: userResult[0],
}
], { session: session });
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/489439.html
標籤:javascript 节点.js 猫鼬
下一篇:使用ObjectId作為資料型別
