Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在.select语句中使用带knex的pgcrypto?(Postgres数据库)_Node.js_Postgresql_Knex.js_Pgcrypto - Fatal编程技术网

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"
  );