AWS Lambda查询参数条件判断实现及无参数报错原因排查
问题原因及解决办法
嘿,这个报错的原因很明确:当没有查询参数的时候,event.queryStringParameters本身就是null,你这时候直接去访问它的id属性,自然会抛出「Cannot read property 'id' of null」的错误——毕竟null是一个空值,根本没有任何属性可以读取。
接下来我们拆解问题并给出修复方案:
1. 先判断queryStringParameters是否存在
在检查id之前,得先确认event.queryStringParameters不是null,否则连访问id的资格都没有,直接会触发报错。
2. 紧急修复SQL注入风险!
另外必须提一句:你原来的代码直接把id拼接到SQL语句里,这是严重的SQL注入漏洞,攻击者可以通过构造恶意id值直接操控你的数据库,绝对不能这么干!一定要用MySQL的参数化查询来避免这个问题。
修改后的完整代码
var mysql = require('mysql'); var config = require('./config.json'); var pool = mysql.createPool({ host: config.host, user: config.user, password: config.password, database: config.database }); exports.handler = (event, context, callback) => { context.callbackWaitsForEmptyEventLoop = false; // 初始化查询语句和参数数组 let query = 'SELECT * from users'; let queryParams = []; // 先判断queryStringParameters是否存在,再检查id是否有效 if (event.queryStringParameters && event.queryStringParameters.id) { query += ' where id = ?'; queryParams.push(event.queryStringParameters.id); } pool.getConnection(function(err, connection) { // 先处理连接错误 if (err) { callback(err); return; } // 使用参数化查询执行SQL connection.query(query, queryParams, function (error, results, fields) { connection.release(); if (error) { callback(error); } else { var response = { "statusCode": 200, "headers": { "my_header": "my_value" }, "body": JSON.stringify(results), "isBase64Encoded": false }; callback(null, response); } }); }); };
关键修改点说明
- 增加了
event.queryStringParameters的存在性判断,从根源避免了null属性读取错误 - 用
?作为占位符,配合参数数组queryParams执行查询,彻底杜绝SQL注入风险 - 补充了数据库连接时的错误处理,避免漏掉连接失败的场景
内容的提问来源于stack exchange,提问作者user11561649
相关产品推荐
相关产品推荐

