在Node.js方法中共享数据库查询

时间:2018-07-21 22:15:10

标签: node.js typescript express knex.js

在多个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;
    }
}

1 个答案:

答案 0 :(得分:0)

例如,您可以创建“服务”模块,其中包含某些查询类型的帮助程序。或者,您可以使用ORM并在每个称为“胖模型”设计的模型中实施特殊查询。只要您记得没有在每个帮助器模块中创建新的knex实例,几乎所有事情都会发生,但是您只需为帮助器方法传递knex(包含其连接池),以便所有查询将共享相同的连接池。

ORM之类的objection.js也提供了扩展查询构建器API的方法,因此您可以使用所需的任何特殊查询助手来继承自定义查询构建器。