如何通过Nakama API实现大小写不敏感的用户名通配符查询
解决方案:Nakama实现用户名大小写不敏感通配符查询
问题根源
你使用的nk.usersGetUsername接口是精确匹配用户名的设计,它仅能查询与传入参数完全一致的用户,不支持通配符(*/%)和大小写不敏感匹配,所以你之前的尝试无法生效。
正确实现方式
由于你使用PostgreSQL数据库,可以通过自定义SQL查询结合PostgreSQL的ILIKE操作符实现需求。ILIKE是PostgreSQL提供的大小写不敏感模糊匹配操作符,配合通配符%即可完成包含/前缀/后缀匹配。
修改后的RPC代码
function rpcCheckUser( ctx: nkruntime.Context, logger: nkruntime.Logger, nk: nkruntime.Nakama, payload: string ): any { logger.info('Check Username Availability rpc called.'); try { const payloadParse = JSON.parse(payload); let usernamePattern = payloadParse.username; // 自动为未带通配符的查询添加前后%,实现包含匹配 if (!usernamePattern.includes('%')) { usernamePattern = `%${usernamePattern}%`; } // 参数化SQL查询,避免注入风险,使用ILIKE实现大小写不敏感匹配 const query = `SELECT id FROM users WHERE username ILIKE $1 LIMIT 1`; const result = nk.sqlQuery(query, [usernamePattern]); // 根据查询结果返回是否存在匹配用户 return result.length > 0 ? 'true' : 'false'; } catch (error) { logger.error('Username check failed: %v', error); return JSON.stringify({ error: "Invalid payload or query error" }); } }
关键说明
- ILIKE操作符:替代普通
LIKE,实现大小写不敏感的模糊匹配,比如查询%Test%会匹配test、TEST、TestUser等所有包含"test"(不区分大小写)的用户名。 - 参数化查询:使用
$1作为占位符,传入参数数组而非直接拼接SQL字符串,彻底避免SQL注入风险。 - 通配符灵活控制:如果需要前缀匹配(如
test%)或后缀匹配(如%test),可以直接让客户端传入带%的模式,代码会保留用户指定的匹配规则。 - 性能优化:添加
LIMIT 1,只要找到一个匹配用户就停止查询,提升效率。
内容的提问来源于stack exchange,提问作者Claud
相关产品推荐
相关产品推荐

