GraphQL+Node.js环境下MySQL查询数据返回null问题求助
问题分析与解决方案
核心问题
- 返回类型不匹配:MySQL查询返回的是结果数组,但你的GraphQL字段
account定义的是单个AccountType对象,类型不匹配导致GraphQL无法解析,最终返回null。 - 查询字段缺失:SQL语句仅查询了
id,但AccountType定义了email、phone、password等字段,这些字段在返回结果中不存在,即使返回单个对象,这些字段也会显示null。 - 未定义函数与错误处理缺失:
isEmpty函数未定义,可能导致空结果判断出错;Promise未处理错误,查询异常会直接抛出未捕获异常。 - 严重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
相关产品推荐
相关产品推荐

