Netlify 函数:GitHub API 代理请求失败并出现“错误解码 lambda 响应:json”

Netlify function: GitHub API proxy request fails with `error decoding lambda response: json`

这个 Netlify 函数应该 运行 作为 example.com/.netlify/functions/github 上的端点并且应该代理来自我网站的获取请求,联系 GitHub API 并且将数据发送回网站。

据我所知,我可以使用从 GitHub API 获取数据而无需身份验证。在浏览器中直接点击他们的 API 有效:https://api.github.com/orgs/github/repos?per_page=2(也适用于 Postman)。

数据是一个对象数组,其中每个对象都是一个存储库。

过去几年出现了多个问题,其中 Netlify 函数(运行ning 在 AWS lambdas 上)出现问题导致出现与我类似的错误消息,所以我很困惑这是否是一个我的代码错误或他们这边的一些奇怪的东西。

首先,代理功能——根据 Netlify 管理控制台——运行s 没有错误。在 support article 中,Netlify 要求返回的结果为 JSON.stringify(),所以我在这里遵循该约定:


const fetch = require('node-fetch')
const url = 'https://api.github.com/orgs/github/repos?per_page=2'

const optionsHeaders = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Headers': 'Content-Type'
}

const fetchHeaders = {
  'Content-Type': 'application/json',
  'Host': 'api.github.com',
  'Accept': 'application/vnd.github.v3+json',
  'Accept-Encoding': 'gzip, deflate, br'
}

exports.handler = async (event, context) => {
  if (event.httpMethod === 'OPTIONS') {
    return {
      'statusCode': '200',
      'headers': optionsHeaders,
    }

  } else {

    try {
      const response = await fetch(url, {
        method: 'GET',
        headers: fetchHeaders
      })

      const data = await response.json()
      console.log(JSON.stringify({ data }))

      return {
        statusCode: 200,
        body: JSON.stringify({ data })
      }

    } catch (err) {
      console.log(err)
    }
  }
}

命中 https://example.com/.netlify/functions/github 的客户端提取。 URL 正确,函数执行(在 Netlify 管理面板中验证):

const repos = document.querySelectorAll('.repo')

if (repos && repos.length >= 1) {
  const getRepos = async (url) => {
    try {
      const response = await fetch(url, {
        method: "GET",
        mode: "no-cors"
      })
      
      const res = await response.text() 
      // assuming res is now _text_ as per `JSON.stringify` but neither 
      // that nor `.json()` work

      console.log(res[0].name)
      return res[0].name

    } catch(err) {
      console.log(err)
    }
  }

  const repoName = getRepo('https://example.com/.netlify/functions/github')
  
  repos.forEach((el) => {
    el.innerText = repoName
  })
}

不能 100% 确定此错误消息的来源,它可能不是 console.log(err) 尽管它显示在浏览器控制台中,因为错误代码是 502 并且错误也直接显示在 Postman 的响应正文中。

error decoding lambda response: error decoding lambda response: json: cannot unmarshal
string into Go value of type struct { StatusCode int "json:\"statusCode\""; Headers
 map[string]interface {} "json:\"headers\""; MultiValueHeaders map[string][]interface {}
 "json:\"multiValueHeaders\""; Body string "json:\"body\""; IsBase64Encoded bool 
"json:\"isBase64Encoded,omitempty\""; Metadata *functions.Metadata 
"json:\"metadata,omitempty\"" }

没有找到关于这个问题的明确资料,有哪位能指教一下吗?

唯一不符合架构的响应是预检请求。根据错误消息,我假设您需要更改:

'statusCode': '200',

'statusCode': 200, // StatusCode int

更好的是,因为没有内容,您可能想改用 204。 如果这还不够,我可能还想把正文也放在那里,因为它似乎不是可选的:

    return {
      'statusCode': 204,
      'headers': optionsHeaders,
      'body': ''
    }