Node.js 如何在.select语句中使用带knex的pgcrypto?(Postgres数据库)
我目前正在使用Node.js 如何在.select语句中使用带knex的pgcrypto?(Postgres数据库),node.js,postgresql,knex.js,pgcrypto,Node.js,Postgresql,Knex.js,Pgcrypto,我目前正在使用knex将我的node.js服务器连接到postgres数据库,我已经开始使用pgcrypto加密我的一些数据。我加密数据的时间有点晚了,所以我有几个查询需要更新,我正在寻找最有效的方法,不仅可以交换查询,还可以实际查询数据库。当我试图直接在knex.select()查询中实现PGP\u SYM\u DECRYPT时,我得到一个错误,说找不到用户。但是,如果我使用knex.raw()查询,我可以让它工作。是否有任何方法可以在.select()查询中使用PGG\u SYM\u DEC
knex
将我的node.js服务器连接到postgres
数据库,我已经开始使用pgcrypto
加密我的一些数据。我加密数据的时间有点晚了,所以我有几个查询需要更新,我正在寻找最有效的方法,不仅可以交换查询,还可以实际查询数据库。当我试图直接在knex.select()
查询中实现PGP\u SYM\u DECRYPT
时,我得到一个错误,说找不到用户。但是,如果我使用knex.raw()
查询,我可以让它工作。是否有任何方法可以在.select()
查询中使用PGG\u SYM\u DECRYPT
,或者可能有一种方法可以将密钥传递到查询旁边,以便自动解密任何加密列
示例工作代码:
const user = await knex("n_user AS u")
.where({
"u.uuid": uuid,
"su.site_id": site.id
})
.first()
.join("site_has_user AS su", { "su.user_id": "u.id" })
.select(
"u.id",
"u.uuid",
"u.mobile_number",
"u.email",
"u.first_name",
"u.last_name",
"u.department",
// "u.note", the note is the encrypted data
"u.disabled",
"su.role"
)
.select(
knex.raw(
`PGP_SYM_DECRYPT(u.note::bytea, '${process.env.SECRET_KEY}') as note`
)
);
示例所需代码(或其他变体):
有什么想法吗?您可以在选择中添加原始片段,如下所示:
.select(
"u.id",
"u.uuid",
"u.mobile_number",
"u.email",
"u.first_name",
"u.last_name",
"u.department",
knex.raw("PGP_SYM_DECRYPT(??::bytea, ?) as note", ['u.note', process.env.SECRET_KEY]),
"u.disabled",
"su.role"
);
在原始语法中,
?
是标识符替换,?
是值绑定,这样就可以将密钥作为绑定安全地传递给驱动程序,而无需尝试将其直接插入SQL字符串。这非常有效!非常感谢:):)
.select(
"u.id",
"u.uuid",
"u.mobile_number",
"u.email",
"u.first_name",
"u.last_name",
"u.department",
knex.raw("PGP_SYM_DECRYPT(??::bytea, ?) as note", ['u.note', process.env.SECRET_KEY]),
"u.disabled",
"su.role"
);