首页 > 解决方案 > 来自 gatsby 站点中本地主机的亚马逊 lambda 函数的跨源

问题描述

我有以下代码,当我使用 netlify dev 将它作为本地无服务器函数运行时,它可以工作,但我需要它从开发服务器跨源运行到托管服务器函数。我将该函数放在 aws lambda 函数中,但在我的 https:dev.website.com 上出现跨源阻止错误,我认为返回对象中有正确的标头,所以不知道为什么会出现跨源错误.

任何帮助都会很棒

const sanityClient = require("@sanity/client");
const client = sanityClient({
  projectId: "random-id",
  dataset: "production",
  useCdn: true,
});

exports.lambdaHandler = async (event, context) => {
  var body = JSON.parse(event.body);

  //console.log(body.price_id)

  try {
    const checkPriceId = async (test) => {
      const query = `*[_type == "products" && price_id == "${body.price_id}"]`;

      const documents = await client.fetch(query, {}); // this could throw

      return documents.map((document) => document.sold);
    };

    var ok = checkPriceId().then((test) => {
      return new Promise(function (resolve, reject) {
        //console.log(test) // this will log the return value from line 7
        console.log(test);
        resolve(test);
      });
    });

    var bools = await ok;
    // prettier-ignore

    return {
      statusCode: 200,
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Headers': 'Content-Type',
        'Access-Control-Allow-Methods':'GET, POST, OPTION',
      },
      body: JSON.stringify({
        sold: bools,
      }),
    };
  } catch (err) {
    return { statusCode: 500, body: err.toString() };
  }
};

如果有帮助,这是我对该功能的要求

 var fetchUrl = https://random.executue-api.aws.com/prod/sold //not exact 

 var fetchData = async function () {
    const response = await fetch(fetchUrl, {
      method: "post",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        price_id: final,
      }),
    })
      .then(res => {
        return res.json()
      })
      .catch(error => console.log(error))

    return response
  }

更新

我尝试按照下面答案中建议的方式添加 cors,但在下面看到它失败了,所以我尝试手动添加之后看到的方法响应。

我仍然收到跨域错误。我已经更改了域,所以它现在也是 https 了。真的卡在这里了。

cors失败

手动添加cors

我对此进行了更多研究,似乎在实际发布之前,它对选项方法进行了 cors 检查,因此我添加了相同的访问控制标头,并进行了部署,但没有成功。不太明白这个。

在此处输入图像描述

标签: javascriptaws-lambdacross-domain

解决方案


检查您的集成响应中的值/尝试为 OPTIONSPOST手动设置它们(如果可行,请确保您从 lambda 正确传递响应)。

您的 POST 操作应该只需要 Access-Control-Allow-Origin 标头。另外两个(Access-Control-Allow-Methods、Access-Control-Allow-Headers)属于 OPTION 动作。请参阅此文章,并注意预检请求的完整示例交换(灰色):https ://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#preflighted_requests

集成到响应映射

在此处输入图像描述


推荐阅读