如何解决如何在不执行Express Js Promise中的下一条语句的情况下从.then进行转义?
通过将mysql2
与promise
一起使用,我得到了 controller.js ,如下所示:
exports.company_add = (req,res) => {
company_model.company_add(admin_email,admin_info).then((result) => { ... })
.catch((err) => { ... })
}
和 model.js 如下:
exports.company_add = (admin_email,admin_info) => {
return new Promise((resolve,reject) => {
connectionPool.getConnection((connectionError,connection) => {
if (connectionError) reject(connectionError);
return connection.promise().query('SELECT * FROM admin WHERE admin_email = ?',[admin_email])
.then(([rows,field]) => {
if (rows.length) reject('Email exist');
else return connection.promise().query('INSERT INTO companydb.admin SET ?',[admin_info])
})
.then((result) => {
console.log('result')
if (result[0].affectedRows === 1) resolve(result);
else reject('INSERT FAIL');
})
.catch((err) => {
reject(err);
})
.finally(() => {
connection.release();
})
});
});
};
我想知道当发生行.then()
时如何从if (rows.length)
语句中跳出,因为如果电子邮件已经存在于此情况下,则在这种情况下无需继续下一个.then()
数据库。我是否需要throw
并在下一个执行.catch()
之前添加一个.then()
?
解决方法
除了嵌套或引发异常外,其他人无法真正break out of a then
chain。是的,在这种情况下,您可能应该throw
,但是当您避免使用Promise
constructor antipattern而只是将其作为链式承诺时,则不需要.catch
:
exports.company_add = (admin_email,admin_info) => {
return connectionPool.getConnection().then(connection => {
return connection.promise().query('SELECT * FROM admin WHERE admin_email = ?',[admin_email])
.then(([rows,field]) => {
if (rows.length)
throw new Error('Email exist');
else
return connection.promise().query('INSERT INTO companydb.admin SET ?',[admin_info])
})
.then((result) => {
console.log('result')
if (result[0].affectedRows !== 1)
throw new Error('INSERT FAIL');
return result;
})
.finally(() => {
connection.release();
})
},err => {
console.error(err);
throw new Error('CONNECTION FAIL');
});
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。