在多个Node.js Express控制器方法之间共享数据库查询代码的最佳实践是什么?我进行了搜索,但发现的样本并没有真正涉足。
例如,我有一个getUser方法(使用Knex for MySQL)进行调用以获取用户信息。我想在其他方法中使用它,但是我不需要像响应对象这样的所有周围事物。
export let getUser = (req: Request, res: Response, next: NextFunction) => {
try {
knex.select().where('email', req.params.email)
.table('users')
.then( (dbResults) => {
const results: IUser = dbResults[0];
res
.status(200)
.set({ 'Content-Type': 'application/json', 'Connection': 'close' })
.send(results);
});
} catch (err) {
res.send({ error: "Error getting person" + req.params.email });
return next(err);
}
};
在需要吸引用户的其他地方重复查询代码似乎是错误的。我是否应该将数据库查询代码转换为类似于本示例的异步函数,然后从使用查询的控制器方法中调用它们?有没有更简单的方法?
/**
* @param {string} email
*/
async function getUserId(email: string) {
try {
return await knex.select('id')
.where('email', email)
.table('users');
} catch (err) {
return err;
}
}
答案 0 :(得分:0)
例如,您可以创建“服务”模块,其中包含某些查询类型的帮助程序。或者,您可以使用ORM并在每个称为“胖模型”设计的模型中实施特殊查询。只要您记得没有在每个帮助器模块中创建新的knex实例,几乎所有事情都会发生,但是您只需为帮助器方法传递knex(包含其连接池),以便所有查询将共享相同的连接池。
ORM之类的objection.js也提供了扩展查询构建器API的方法,因此您可以使用所需的任何特殊查询助手来继承自定义查询构建器。