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

GraphQL+Node.js环境下MySQL查询数据返回null问题求助

问题分析与解决方案

核心问题

  1. 返回类型不匹配:MySQL查询返回的是结果数组,但你的GraphQL字段account定义的是单个AccountType对象,类型不匹配导致GraphQL无法解析,最终返回null。
  2. 查询字段缺失:SQL语句仅查询了id,但AccountType定义了email、phone、password等字段,这些字段在返回结果中不存在,即使返回单个对象,这些字段也会显示null。
  3. 未定义函数与错误处理缺失:isEmpty函数未定义,可能导致空结果判断出错;Promise未处理错误,查询异常会直接抛出未捕获异常。
  4. 严重SQL注入风险:直接将用户输入拼接进SQL语句,存在被注入攻击的隐患。

修复步骤

1. 修正查询结果返回格式

在queries.js中,返回数组的第一个元素(单个用户对象),而非整个数组:

var connection = require('./connection');
var db = connection.connect();

module.exports = {
    login: (email, password) => {
        return new Promise((resolve, reject) => {
            // 使用参数化查询避免SQL注入
            const accountSql = 'SELECT id, email, phone, password FROM accounts WHERE email = ? AND password = ?';
            db.query(accountSql, [email, password], (err, result) => {
                if (err) return reject(err);
                // 直接通过数组长度判断是否有结果
                if (result.length === 0) {
                    return resolve(null);
                } else {
                    // 返回第一个匹配的用户对象
                    return resolve(result[0]);
                }
            })
        })
    }
}

2. 补充查询字段

将email、phone、password加入SELECT语句,确保返回的对象包含AccountType定义的所有字段。

3. 完善resolve函数的错误处理

在Schema.js的resolve函数中加入try/catch,捕获并抛出查询错误:

async resolve(parent, args) {
    try {
        return await queries.login(args.email, args.password);
    } catch (err) {
        throw new Error(err.message);
    }
}

4. 移除未定义的isEmpty函数

直接用result.length === 0判断查询结果是否为空,避免依赖未定义的函数。


验证效果

修改完成后:

  • 当用户名密码匹配时,GraphiQL会返回包含id、email、phone、password的完整Account对象;
  • 当无匹配结果时,返回null;
  • 查询异常时,GraphiQL会返回对应的错误信息。

内容的提问来源于stack exchange,提问作者mfusco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:33:23