cors 不能在具有 express 的 firebase 功能中工作

Posted

技术标签:

【中文标题】cors 不能在具有 express 的 firebase 功能中工作【英文标题】:cors not working in firebase functions with express 【发布时间】:2021-05-24 13:44:09 【问题描述】:

我在使用 express 的 firebase 函数中遇到 cors 问题,我已经尝试了很多关于这个特定问题的方法,这些只是其中的一部分:

我尝试在res.send()之前设置标题:

res.setHeader("Access-Control-Allow-Origin", '*');

我试图让请求通过 cors 中间件:

return cors(req, res, async() =>  await ...  )

尝试将 cors 原点设置为 "Origin": true"Origin": "*"

例如尝试设置app.options()

app.options('*', cors()) // for every route

这些都不起作用,我得到了预检错误,正如我所说,我从博客文章和这里 (***) 尝试了很多东西,没有一个答案真的对此有帮助,所以有人可以解释我为什么会得到下面的错误,那是什么预检,为什么它没有通过控制检查?

访问 XMLHttpRequest 在 'https://us-central1-projectName.cloudfunctions.net/api/create-customer' 来自原点“http://localhost:4200”已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

我在后端方面的经验很少,我认为现在尝试弄清楚这一点肯定会对将来有所帮助,因为我仍在学习后端。

想看完整代码的朋友:

import * as functions from 'firebase-functions';
import * as express from 'express';
import Stripe from 'stripe';
import cors from 'cors';

const app = express();

app.use(cors( origin: true ));
app.options('*', cors( origin: true ));

const stripe = new Stripe(
  'API KEY',
);

app.get('/process-subscription', async (req, res) => 
  const endReq = () => 
    res.end();
  ;
  const 
    customerId,
    checkPlan,
   = req.params;

  if (checkPlan !== 'premium') 

    try 
      console.log(customerId);
      const subscription = await stripe.subscriptions.create(
        customer: customerId,
        items: [ price: 'id' ], 
      );


      res.setHeader('Access-Control-Allow-Origin', '*');
      return res.send(subscription.id);
     catch (err) 
      res.send(err);
      endReq();
    
   else 
    return res.send(
      isPremium: true,
      message: 'You already own a Premium Subscription!',
    );
    endReq();
  
);

app.get('/create-customer', async (req, res) => 
  return cors(req, res, async () => 
    const endReq = () => 
      res.end();
    ;
    const  email, name  = req.body;

    try 
      const customer = await stripe.customers.create(
        email: email,
        name: name,
      );
      res.setHeader('Access-Control-Allow-Origin', '*');
      return res.status(200).send(customer.id);
     catch (err) 
      res.send(err);
      endReq();
    
  );
);

app.get('/attach-method', async (req, res) => 
  res.set('Access-Control-Allow-Origin', '*');
  const endReq = () => 
    res.end();
  ;

  const  customerId, paymentMethod  = req.params;
  try 
    const attachMethod = await stripe.paymentMethods.attach(paymentMethod, 
      customer: customerId,
    );
    let customer = await stripe.customers.update(customerId, 
      invoice_settings: 
        default_payment_method: paymentMethod,
      ,
    );
    res.setHeader('Access-Control-Allow-Origin', '*');
    return res.status(200).send('Success');
   catch (err) 
    res.send(err);
    endReq();
  
);

export const api = functions.https.onRequest(app);

谢谢。

【问题讨论】:

这能回答你的问题吗? Enable Cors in Firebase Cloud Function 【参考方案1】:

解决这个问题,而不是在快速路线中使用

return cors(req, res, () => ...)

我用过这个,只是在cors后面加了括号:

return cors()(req, res, () => ...)

【讨论】:

你能分享你的整个代码吗?

以上是关于cors 不能在具有 express 的 firebase 功能中工作的主要内容,如果未能解决你的问题,请参考以下文章

由于 CORS 错误,Socket.io 和 express 应用程序无法连接:“'Access-Control-Allow-Origin' 标头的值不能是通配符 '*'”

如何在不重写所有路由的情况下禁用 Express 中单个路由的 CORS?

具有 REST 身份验证 API 的节点快递网站 - CORS 问题

Node express 服务器,CORS API 限制,包括我的开发机器的 hosts 文件中的一个条目

Express 配置为使用 CORS 不接受 CORS

Fire