我发现使用promise
或callback
编写节点函数有两种不同的方法,第一种方法类似于定义findByEmail
函数:
class Users{
static async findByEmail(email: any ) : Promise<Users | undefined>{
const user: any = await Pools.execute(
"SELECT * FROM users WHERE email = ?",
[email])
.then(rows => {
return rows[0];
})
.catch(err => console.log(err) );
return user;
};
}
router.post(
"/api/users/signin",
async (req: Request, res: Response , next: NextFunction) => {
const { email, password } = req.body;
const existingUser = await Users.findByEmail(email);
});
第二种方法是:
declare global {
namespace Express {
interface Response {
user?: Users;
}
}
}
static async findByEmail(req: Request, res: Response) {
const user = await Pools.execute(
"SELECT * FROM users WHERE email = ?",
[req.body.email])
.then(rows => {
res.user = rows[0];
})
.catch(err => console.log(err) );
};
router.post(
"/api/users/signin",
async (req: Request, res: Response , next: NextFunction) => {
await Users.findByEmail(req, res);
const existingUser = res.user;
});
我不确定这是否是一个“基于意见”的问题?但是我问这个问题的目的是想知道哪种方式是更好的实践,为什么?根据性能和其他可能的问题?
特别是我想知道用return
值编写函数或使用response
对象将返回值添加到then()
函数内部的值是否更好,例如.then(res.user = user)
而不是const user = await pool.execute(SELECT ...)
?
1条答案
按热度按时间yqhsw0fo1#
这里有一种穿刺方法,可以进行以下改进:
1.使
findByEmail()
成为独立于req
和res
对象的实用函数,因此可以通用。1.正确地将所有错误从
findByEmail()
传播回调用方。1.实现了一些验证检查传入的电子邮件字段,并使单独的错误路径.
1.记录服务器上的所有错误
1.检查数据库请求中的所有错误条件
1.不混合
.then()
和await
。下面是代码: