【问题标题】:OPTIONS call is seen as a "regular" callOPTIONS 调用被视为“常规”调用
【发布时间】:2019-10-30 22:31:14
【问题描述】:

当我开始在本地调试我的第一个云函数时,我注意到从 web 应用调用该函数时有两个条目被添加到数据库中,而使用 Postman 时只有一个条目(预期行为)。

它立即让我想到了 OPTIONS 调用,它现在是大多数浏览器 HTTP 请求的一部分。

我设法通过添加这个来规避这个

  if (req.method === "POST") {

围绕我的函数主体,但如果真的有必要,我会感到惊讶。

还有其他更好的方法吗?

使用代码 sn-p 编辑

module.exports = async (req, res) => {
  res.set("Access-Control-Allow-Origin", "*");
  res.set(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );

  if (req.method === "POST") {
    const uri = MYMONGOURI;
    const client = new MongoClient(uri, { useNewUrlParser: true });

    await client.connect();

    const collection = client.db(MYDB).collection(MYCOLLECTION);
    const { title } = req.body;
    await collection.insertOne({ title });

    client.close();
    res.sendStatus(201);
  }

  res.send("Apparently not post..");
};

【问题讨论】:

  • 当你看到两个请求进来时,你能不能把这两个请求的完整细节转储出来看看它们包含什么。我原以为 OPTIONS 请求会在前端处理。您有多确定第一个请求是 OPTIONS?你对你的功能的定义是什么?你能转储函数定义的当前状态吗?
  • 请向我们展示您的相关服务器端代码。在 Express 中,您可以使用 app.post(),它只会在 POST 请求时触发。
  • 我已经用完整的代码 sn-p 编辑了我的问题。但是请注意,这是通过 Google Cloud Functions 完成的,因此我无法完全控制我的快递'app 我认为..
  • 您添加了一个代码 sn-p,但您没有添加最重要的部分,即该路由的定义方式。如果你想让 OPTIONS 请求去到不同的地方,你必须以不同的方式定义路由。
  • @jfriend00 就像我说的,我不处理路由。此文件已上传到 Google Cloud Functions..

标签: node.js express google-cloud-functions


【解决方案1】:

当您编写云函数并从托管云函数的域以外的域的网页调用它时,浏览器需要 CORS 批准才能发出请求。这在此处有完整记录:

最重要的是,您自己的函数实现应该准备好处理 HTTP OPTIONS 请求,并根据传入的参数决定是允许还是拒绝请求。 OPTIONS 请求在主请求之前发送飞行前批准。

如果您不想将代码包含在您的 Cloud Function 中,您可以使用 Cloud Endpoints 将您的浏览器置于前端以代表您处理 CORS 请求。

另见:

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 2015-05-26
    • 1970-01-01
    • 2012-11-06
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多