【问题标题】:How to prevent 504 and get response to the client如何防止 504 并获得客户端响应
【发布时间】:2021-01-18 00:50:05
【问题描述】:

我在 AWS 上托管了一个无服务器节点。我正在从客户端发出请求,将一组对象插入到 postgres 数据库中。此请求负载有 >10000 个对象。

我遇到了这个错误 CORS 策略阻止了从源域获取“endpoint/ModelSProductAttributesUploadExcelData”的访问权限:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

基本上服务器在发送请求之前超时。我能做些什么来防止这种情况发生?

我的插入逻辑如下:

if (
    data[0].hasOwnProperty("SFC") &&
    data[0].hasOwnProperty("StyleDesc") &&
    data[0].hasOwnProperty("FabricDesc") &&
    data[0].hasOwnProperty("ColorDesc") &&
    data[0].hasOwnProperty("EventDesc") &&
    data[0].hasOwnProperty("DptDesc") &&
    data[0].hasOwnProperty("SubDptDesc") &&
    data[0].hasOwnProperty("ClassDesc") &&
    data[0].hasOwnProperty("InCollection") &&
    data[0].hasOwnProperty("Function")
  ) {
    const altered = data.reduce(
      (acc, item) =>
        (({ SFC, ...rest }) =>
          Object.entries(rest).reduce(
            (result, [Attribute, Value]) => [
              ...result,
              { SFC, Attribute, Value, Username: username },
            ],
            acc
          ))(item),
      []
    );
    let final_array = altered.filter(
      (item) =>
        item.Attribute !== "StyleDesc" &&
        item.Attribute !== "FabricDesc" &&
        item.Attribute !== "ColorDesc" &&
        item.Attribute !== "EventDesc" &&
        item.Attribute !== "DptDesc" &&
        item.Attribute !== "SubDptDesc" &&
        item.Attribute !== "SubDptDesc" &&
        item.Attribute !== "ClassDesc" &&
        item.Attribute !== "InCollection" &&
        item.Attribute !== "Function"
    );

    let sfcs = _.uniqBy(final_array, "SFC").map((item) => item.SFC);
    sfcs = sfcs.map((sfc) => `'${sfc}'`);
    console.log(sfcs);
    try {
      const client = connection();
      await client.connect();
      let query1 = `DELETE from models."InputAttributes" where "SFC" in (${sfcs})`;
      const result1 = await client.query(query1);
      console.log(result1);
      query2 = `INSERT into models."InputAttributes" ("SFC", "Attribute", "Value","Username","CreatedDate") VALUES`;
      for (let i = 0; i < final_array.length; i++) {
        if (i === final_array.length - 1) {
          string = `('${final_array[i].SFC}','${final_array[i].Attribute}','${final_array[i].Value}','${final_array[i].Username}',CURRENT_TIMESTAMP)`;
        } else {
          string = `('${final_array[i].SFC}','${final_array[i].Attribute}','${final_array[i].Value}','${final_array[i].Username}',CURRENT_TIMESTAMP),`;
        }
        query2 += string;
      }
      const result2 = await client.query(query2);
      if (result2) {
        res.sendStatus(200);
      }
    } catch (error) {
      res.sendStatus(500);
    }
  } else {
    res.sendStatus(400);
  }

【问题讨论】:

    标签: node.js amazon-web-services timeout


    【解决方案1】:

    我认为错误不是因为请求超时,而是因为您没有在服务器中启用 CORS 策略。因此出现错误:被 CORS 政策阻止。

    //enable cors
    var cors = require('cors')
    
    var app = express()
    app.use(cors())
    

    关于您问题的第二部分,无需等待即可发送请求,只需发送响应而不进行处理,如果这适用于您的情况。

    //It would look something like this.
    async (req, res)=>{
        res.send(responseData)
        // do the remaining processing here
    }
    

    【讨论】:

    • 我已启用 CORS 策略,这与此无关,因为我收到了针对较小请求负载的响应。只是如果数组有超过 10000 个对象,那么我就会得到那个错误。
    • 尝试我发布的第二个选项,有帮助吗?
    • 你能把你的代码贴在这里吗?因为在第二种情况下,当我给出解决方案时,它应该发送响应而不等待处理。所以你不应该得到超时错误。
    【解决方案2】:

     if (
        data[0].hasOwnProperty("SFC") &&
        data[0].hasOwnProperty("StyleDesc") &&
        data[0].hasOwnProperty("FabricDesc") &&
        data[0].hasOwnProperty("ColorDesc") &&
        data[0].hasOwnProperty("EventDesc") &&
        data[0].hasOwnProperty("DptDesc") &&
        data[0].hasOwnProperty("SubDptDesc") &&
        data[0].hasOwnProperty("ClassDesc") &&
        data[0].hasOwnProperty("InCollection") &&
        data[0].hasOwnProperty("Function")
      ) {
        const altered = data.reduce(
          (acc, item) =>
            (({ SFC, ...rest }) =>
              Object.entries(rest).reduce(
                (result, [Attribute, Value]) => [
                  ...result,
                  { SFC, Attribute, Value, Username: username },
                ],
                acc
              ))(item),
          []
        );
        let final_array = altered.filter(
          (item) =>
            item.Attribute !== "StyleDesc" &&
            item.Attribute !== "FabricDesc" &&
            item.Attribute !== "ColorDesc" &&
            item.Attribute !== "EventDesc" &&
            item.Attribute !== "DptDesc" &&
            item.Attribute !== "SubDptDesc" &&
            item.Attribute !== "SubDptDesc" &&
            item.Attribute !== "ClassDesc" &&
            item.Attribute !== "InCollection" &&
            item.Attribute !== "Function"
        );
    
        let sfcs = _.uniqBy(final_array, "SFC").map((item) => item.SFC);
        sfcs = sfcs.map((sfc) => `'${sfc}'`);
        console.log(sfcs);
        try {
          const client = connection();
          await client.connect();
          let query1 = `DELETE from models."InputAttributes" where "SFC" in (${sfcs})`;
          const result1 = await client.query(query1);
          console.log(result1);
          let query2 = `INSERT into models."InputAttributes" ("SFC", "Attribute", "Value","Username","CreatedDate") VALUES`;
          for (let i = 0; i < final_array.length; i++) {
            if (i === final_array.length - 1) {
              string = `('${final_array[i].SFC}','${final_array[i].Attribute}','${final_array[i].Value}','${final_array[i].Username}',CURRENT_TIMESTAMP)`;
            } else {
              string = `('${final_array[i].SFC}','${final_array[i].Attribute}','${final_array[i].Value}','${final_array[i].Username}',CURRENT_TIMESTAMP),`;
            }
            query2 += string;
          }
          const result2 = await client.query(query2);
          // if (result2) {
          res.send(result2);
          // }
        } catch (error) {
          res.sendStatus(500);
        }
      } else {
        res.sendStatus(400);
      }
    };

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 2018-04-23
      相关资源
      最近更新 更多