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

AWS Lambda Ruby代码Postman调用报502错误求助

AWS Lambda Ruby代码Postman请求返回502 Bad Gateway,CloudWatch报undefined method `new' for Array错误

问题场景

使用Ruby开发AWS Lambda处理支付通知请求时,控制台配置的测试事件运行完全正常,但通过Postman发送相同结构的请求时,返回502 Bad Gateway错误。查看CloudWatch日志,得到以下报错:

{
    "errorMessage": "undefined method `new' for [PaymentGateway]:Array",
    "errorType": "Function<NoMethodError>",
    "stackTrace": [
        "/var/task/payment_notification_request.rb:23:in `process'",
        "/var/task/lambda_function.rb:7:in `lambda_handler'"
    ]
}

相关代码片段:

require "payment_notification_response.rb"
Dir["payment_gateway/*.rb"].each {|file| require file }

class PaymentNotificationRequest
    attr_accessor :headers, :body, :query_params, :http_method, :payment_gateway
    PAYMENT_GATEWAYS = [::PaymentGateway]

    def initialize(event)
        self.headers = event["headers"] rescue {}
        self.body = JSON.parse(event['body'].to_json, symbolize_names: true) rescue {}
        self.query_params = event['queryStringParameters'] rescue {}
        self.http_method = event["requestContext"]["http"]["method"] rescue {}
        self.payment_gateway = self.find_payment_gateway_by_request
    end

    def find_payment_gateway_by_request
        PAYMENT_GATEWAYS.each do |pg|
            return pg if pg.new(self).is_the_requester?
        end
    end
    
    def process
        return self.payment_gateway.new(self).process
    end
    
end

异常原因

  1. 控制台测试事件的特殊性:控制台的测试事件满足PaymentGateway类中is_the_requester?的判断条件,find_payment_gateway_by_request方法会提前return返回PaymentGateway类,后续process方法调用new方法正常执行。
  2. Postman请求的不匹配:Postman发送的请求不满足is_the_requester?的判断条件,find_payment_gateway_by_request方法中each遍历完PAYMENT_GATEWAYS数组后没有触发提前返回。Ruby中each方法默认会返回调用它的原数组,导致self.payment_gateway被赋值为[::PaymentGateway]数组。
  3. 错误触发点:process方法尝试调用数组的new方法,但数组本身没有该方法,因此抛出NoMethodError,最终导致Lambda返回502 Bad Gateway。

解决方案

1. 修正find_payment_gateway_by_request的返回逻辑

在遍历结束后添加明确的默认处理,避免返回原数组:

def find_payment_gateway_by_request
    PAYMENT_GATEWAYS.each do |pg|
        return pg if pg.new(self).is_the_requester?
    end
    # 无匹配网关时抛出明确异常,便于排查
    raise "No matching payment gateway found for this request"
end

2. 在process方法中增加类型校验

确保调用new前payment_gateway是合法的类:

def process
    unless self.payment_gateway.is_a?(Class)
        raise "Invalid payment gateway type: #{self.payment_gateway.class}"
    end
    self.payment_gateway.new(self).process
end

3. 排查请求差异

对比Postman请求和控制台测试事件的headers、body、queryStringParameters、请求方法等内容,确认是否存在参数缺失、格式不一致、编码差异等问题,导致is_the_requester?判断不通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:18:13