Nuxt.js CORS 错误:它没有 HTTP ok 状态

Posted

技术标签:

【中文标题】Nuxt.js CORS 错误:它没有 HTTP ok 状态【英文标题】:Nuxt.js CORS error: It does not have HTTP ok status 【发布时间】:2021-08-06 09:26:51 【问题描述】:

我正在构建 Nuxt.js 应用,但遇到了 CORS 错误。我已经在我请求资源的服务器上启用了 CORS,从该服务器上解决了我原来的 CORS 错误,但现在我看到一个新错误,“它没有 HTTP ok 状态。”

这是来自 Nuxt.js 应用的标注。

async executeCallout(context, payload) 

    // Start loading...
    let loadingId = context.dispatch('handleLoad',  
      msg: 'Getting the thing', 
      method: 'executeCallout', 
      id: null 
    ,  root: true );

    // Execute http request. 
    let url = context.getters.getCalloutUrl(payload.func);
    let response = await this.$axios(
      method: 'post', 
      headers: 
        "Content-type": "application/json"
      ,
      url: url,
      data: payload.body
    );

    // Resolve loading...
    context.dispatch('handleLoad', 
      msg: null, 
      method: null, 
      id: loadingId
    ,  root: true );
    
    // Handle http response.
    if (response.data.success) 
      return response.data;
     else 
      context.dispatch('handleError',  
        msg: response.data.data, 
        origin: 'callouts.js', 
        method: 'executeCallout' 
      ,  root: true )
    
  
;

这是处理请求的谷歌云函数。

const helper = require('./helper');
const Joi = require('joi');

exports.handler = async (req, res) => 
  try 

    // Set headers
    res.set('Access-Control-Allow-Origin', '*');
    if (req.method == 'OPTIONS') 
      res.set('Access-Control-Allow-Methods', 'POST', 'OPTIONS');
      res.set('Access-Control-Allow-Headers', 'Content-Type');
    

    const payload = await schema.validate(req.body);
    if (payload.error) 
      res.status(400).json(
        success: false, 
        data: payload.error
      )
     else 
      if (payload.value.product == 'quickbooks') 
        let response = await helper.functionCall( alias: payload.value.alias, function: 'intuit', payload: payload.value.payload );
        res.status(response.success ? 200 : 400).json(
          success: response.success ? true : false, 
          data: response.data
        )
       else if (payload.value.product == 'distance-matrix') 
        let response = await helper.functionCall( alias: payload.value.alias, function: 'distance-matrix', payload: payload.value.payload );
        res.status(response.success ? 200 : 400).json(
          success: response.success ? true : false, 
          data: response.data
        )
      
    
   catch (err) 
    res.status(500).json(
      success: false, 
      data: err
    )
  


const schema = Joi.object(
  alias: Joi.string().required(), 
  product: Joi.string(),
  action: Joi.string(), 
  payload: Joi.object()
)

尝试发送请求时的响应如下所示。

【问题讨论】:

这能回答你的问题吗? Why does my http://localhost CORS origin not work? 【参考方案1】:

您可能需要设置飞行前响应的 HTTP 状态。

const helper = require('./helper');
const Joi = require('joi');

exports.handler = async (req, res) => 
  try 

    // Set headers
    res.set('Access-Control-Allow-Origin', '*');

    if (['POST', 'OPTIONS'].includes(req.method)) 
      res.set('Access-Control-Allow-Methods', 'POST', 'OPTIONS');
      res.set('Access-Control-Allow-Headers', 'Content-Type');
    

    if (req.method == 'OPTIONS') 
      res.status(200)
      return
    

    const payload = await schema.validate(req.body);

    if (payload.error) 
      res.status(400).json(
        success: false,
        data: payload.error
      )
     else 
      if (payload.value.product == 'quickbooks') 
        let response = await helper.functionCall(
          alias: payload.value.alias,
          function: 'intuit',
          payload: payload.value.payload
        );
        res.status(response.success ? 200 : 400).json(
          success: response.success ? true : false,
          data: response.data
        )
       else if (payload.value.product == 'distance-matrix') 
        let response = await helper.functionCall(
          alias: payload.value.alias,
          function: 'distance-matrix',
          payload: payload.value.payload
        );
        res.status(response.success ? 200 : 400).json(
          success: response.success ? true : false,
          data: response.data
        )
      
    
   catch (err) 
    res.status(500).json(
      success: false,
      data: err
    )
  


const schema = Joi.object(
  alias: Joi.string().required(),
  product: Joi.string(),
  action: Joi.string(),
  payload: Joi.object()
)

注意我添加的代码:

    if (['POST', 'OPTIONS'].includes(req.method)) 
      res.set('Access-Control-Allow-Methods', 'POST', 'OPTIONS');
      res.set('Access-Control-Allow-Headers', 'Content-Type');
    

    if (req.method == 'OPTIONS') 
      res.status(200)
      return
    

我还没有使用谷歌云功能,所以我不确定是不是我错了。如果有的话请给我反馈。

【讨论】:

这似乎已经解决了这个问题,尽管现在我回到了原来的 CORS 错误。 “从源 'localhost:3000' 访问 XMLHttpRequest 在 'localhost:3000' 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:不存在 'Access-Control-Allow-Origin' 标头请求的资源。”

以上是关于Nuxt.js CORS 错误:它没有 HTTP ok 状态的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 和 Nuxt.js 中的 Firebase 存储 CORS 错误

Laravel Sanctum + Nuxt JS 我无法通过 CORS

为Nuxt.js部署云功能错误

Nuxt.js 安装错误

CORS 错误:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态

尝试从 Web 应用程序获取数据时出现 Cors 错误(没有“访问控制允许来源”/它没有 HTTP ok 状态。)