首页 > 解决方案 > 如何防止 504 并获得客户端响应

问题描述

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

我有这个错误 访问从源域的“endpoint/ModelSProductAttributesUploadExcelData”获取已被 CORS 策略阻止:请求的资源上不存在“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.jsamazon-web-servicestimeout

解决方案


我认为错误不是因为请求超时,而是因为您没有在服务器中启用 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
}

推荐阅读