如何使用 Knex 将函数应用于 where 子句的值?

How to apply a function on a value of a where clause using Knex?

基本上,我想知道如何使用 Knex 生成此查询:

SELECT * FROM usr_info WHERE login = ? AND password = PASSWORD(?)

例如:

knex('usr_info')
  .where({
    'login': login,
    'password': password   // <-- specify a function to wrap the value into
  })
;

查看文档,我没有看到允许这样做的示例。这可能吗?

您可能需要使用 whereRaw()

knex('usr_info')
  .whereRaw('login = ? AND password = PASSWORD(?)', [login, password]);

顺便说一下,您不应该使用 MySQL 的 PASSWORD() 函数进行您自己的应用程序身份验证。此功能已在 MySQL 8.0.11 中删除。在 MySQL 5.7 中,它已被弃用,并且有一个注释:

https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password

PASSWORD() is used by the authentication system in MySQL Server; you should not use it in your own applications. For that purpose, consider a more secure function such as SHA2() instead.

此外,将明文密码传递给您的查询并不是一个好主意,因为它可能会以明文形式记录在查询日志中。

相反,我建议您在查询中只搜索 login,这样结果将包括存储在数据库中的散列密码。您可以对应用代码中的密码进行哈希处理,并将其与查询返回的哈希值进行比较。