You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:15:03