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

AWS Lambda中使用mssql包查询超时/返回空值问题求助

问题描述

在AWS Lambda中使用Node.js的mssql包执行SQL查询时遇到以下问题:

  • Lambda函数超时、返回null或{}
  • 本地测试时,仅通过console.log输出result.recordset才能看到结果,否则无返回
  • 尝试过.then()语法但未解决问题

原代码

const sql = require('mssql')

const pool = new sql.ConnectionPool({
    user: process.env.USER,
    password: process.env.PASSWORD,
    server: proccess.env.SERVER, // 拼写错误
    driver: process.env.SERVER, // 配置错误
    database: process.env.DATABASE,
    port: process.env.PORT,
    options: {
        ConnectionTimeout:30,
        CommandTimeout:30,
        encrypt: true, // for azure
        trustServerCertificate: true, // change to true for local dev / self-signed certs
    }
})

async function getList(){
    var sqlQuery = "select * from table" //obfuscating my query for obvious reasons
    pool.connect(function(err){
        console.log("connected")
     if(err){
       console.log(err);
     }
     var req = new sql.Request(pool);
     console.log("request query in progress")
     req.query(sqlQuery ,function(err,result){
      if(err){
       console.log(err);
      }
      else{
       console.log("returning query results!")
       return buildResponse(200, result.recordset)
      }
       
      pool.close();
     });
    });
}

function buildResponse(statusCode, body) {
    return {
      statusCode: statusCode,
      headers: {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin':'*',
        'Access-Control-Allow-Methods':'GET,OPTIONS',
        'Access-Control-Allow-Headers':'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'
      },
      body: JSON.stringify(body),
      isBase64Encoded: false
    }
}

getList()

问题根源与修复方案

1. 异步逻辑未正确处理

getList声明为async函数,但内部使用回调式异步操作(pool.connect、req.query),未用await或Promise封装,导致函数直接返回,Lambda无法等待异步操作完成,最终超时或返回空值。回调内的return无法传递到外层async函数。

2. 配置错误

  • proccess.env.SERVER拼写错误,应为process.env.SERVER
  • driver字段配置错误,不能复用SERVER环境变量,正确值应为'msnodesqlv8'或对应版本驱动
  • port需为数值类型,process.env.PORT是字符串,需转成数字
  • 超时参数名错误(ConnectionTimeout→connectionTimeout、CommandTimeout→requestTimeout),且单位为毫秒,原代码的30会导致30毫秒超时,需改为30000(30秒)

3. 连接池关闭时机错误

原代码中pool.close()在回调外执行,会在查询完成前关闭连接,导致查询失败。


修复后的完整代码

const sql = require('mssql')

// 修正配置错误,处理环境变量类型转换
const pool = new sql.ConnectionPool({
    user: process.env.USER,
    password: process.env.PASSWORD,
    server: process.env.SERVER, // 修正拼写
    driver: process.env.DRIVER || 'msnodesqlv8', // 正确配置驱动
    database: process.env.DATABASE,
    port: parseInt(process.env.PORT, 10), // 转成数值类型
    options: {
        connectionTimeout: 30000, // 修正参数名与超时时间
        requestTimeout: 30000,
        encrypt: true,
        trustServerCertificate: true,
    }
})

// 使用async/await处理异步,确保Lambda能等待结果
async function getList() {
    let connection;
    const sqlQuery = "select * from table";
    try {
        // 等待连接池建立连接
        connection = await pool.connect();
        console.log("connected");
        
        // 执行查询并等待结果
        const result = await connection.request().query(sqlQuery);
        console.log("returning query results!");
        
        // 返回构造好的响应
        return buildResponse(200, result.recordset);
    } catch (err) {
        console.error(err);
        // 捕获错误并返回错误响应
        return buildResponse(500, { error: err.message });
    } finally {
        // 确保连接关闭,无论成功失败都会执行
        if (connection) {
            pool.close();
        }
    }
}

function buildResponse(statusCode, body) {
    return {
        statusCode: statusCode,
        headers: {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET,OPTIONS',
            'Access-Control-Allow-Headers': 'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'
        },
        body: JSON.stringify(body),
        isBase64Encoded: false
    }
}

// Lambda标准入口函数,替换原直接调用getList()
exports.handler = async () => {
    return await getList();
};

额外注意事项

  • Lambda超时时间需设置为10-30秒,避免因查询耗时过长超时
  • 确保Lambda执行角色有访问SQL Server的权限(VPC内数据库需配置VPC访问)
  • 环境变量需正确配置USER、PASSWORD、SERVER、DATABASE、PORT、DRIVER

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:05:42