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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:00:44