无服务器和PUT命令的CORS问题

时间:2017-03-21 21:23:49

标签: node.js amazon-web-services cors serverless-framework

我遇到了无服务器和AWS的另一个CORS问题。似乎我需要特别告诉它允许PUT方法,但我不确定这个代码在哪里。我的Lambda函数有以下代码:

module.exports.update = (event, context, callback) => {
  const timestamp = new Date().getTime();
  const data = JSON.parse(event.body);
  if (typeof event.pathParameters.timeoffgroupid !== 'string') {
    console.error('Validation Failed');
    callback(new Error('Couldn\'t update the todo item.'));
    return;
  }
  const params = {
    TableName: 'TimeOffGroup',
    Key: {
      timeoffgroupid: event.pathParameters.timeoffgroupid,
    },
    ExpressionAttributeValues: {
      ':timeOffGroup': data.timeOffGroup,
      ':timeOffGroupColor': data.timeOffGroupColor,
      ':dateModified': timestamp
    },
    UpdateExpression: 'SET timeOffGroup = :timeOffGroup, timeOffGroupColor = :timeOffGroupColor, dateModified = :dateModified',
    ReturnValues: 'ALL_NEW',
  };

  dynamoDb.update(params, (error, result) => {
    if (error) {
      console.error(error);
      callback(new Error('Couldn\'t update the todo item.'));
      return;
    }
    const response = {
      statusCode: 200,
      body: JSON.stringify(result.Attributes),
      headers: {
        "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
        "Access-Control-Allow-Credentials" : true
      }
    };
    callback(null, response);
  });
};

我得到的错误是:

  

XMLHttpRequest无法加载   https://pwqlomgq89.execute-api.us-east-1.amazonaws.com/dev/timeoffgroup/7d463800-0935-11e7-b618-4b1d72ddca8e?timeOffGroup=Holiday+edited。   请求中不存在“Access-Control-Allow-Origin”标头   资源。因此不允许来源“http://localhost:9000”   访问。响应具有HTTP状态代码502.angular.js:14328   可能是未处理的拒绝:   { “数据”:NULL, “状态”: - 1, “配置”:{ “方法”: “PUT”, “transformRequest”:[空], “transformResponse”:[空], “jsonpCallbackParam”: “回调” “数据”:{}, “URL”: “https://pwqlomgq89.execute-api.us-east-1.amazonaws.com/dev/timeoffgroup/7d463800-0935-11e7-b618-4b1d72ddca8e”, “PARAMS”:{ “timeOffGroup”:“假日   编辑“},”标题“:{”接受“:”application / json,text / plain,    / ”, “内容类型”: “应用/ JSON;字符集= UTF-8”}}, “状态文本”: “”}

我已经完成了对无服务器教程的所有调用,以使CORS正常工作。但似乎我得到了get和create,但是PUT命令不起作用。我是否需要设置更新命令以允许跨域的PUT?

看起来我可能需要更多PUT方法访问权限: 标题:

{
    "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
    "Access-Control-Allow-Credentials" : true
}

2 个答案:

答案 0 :(得分:2)

您的问题似乎是您没有处理OPTIONS动词。请参阅此answer以了解有关此要求的更多信息。

在发出PUT请求之前,浏览器将预检OPTIONS请求作为安全措施,以确保服务器期望此类请求。如果您不支持OPTIONS,则不会发出PUT请求。

要解决此问题,请更改 serverless.yml 文件以添加OPTIONS支持。

functions:
  func:
    handler: handler.func
    events:
      - http: PUT foo/bar
      - http: OPTIONS foo/bar

使用以下内容修改句柄:

module.exports.func = (event, context, callback) => {

  try {
    switch(event.httpMethod + ' ' + event.resource) {
      case 'PUT /foo/bar':
        handlePut(callback);
        break;
      case 'OPTIONS /foo/bar':
        handleOptions(callback);
        break;
      default:
        // return HTTP 400
    }
  }
  catch (err) {
     // return HTTP 500
  }
};

const handlePut = (callback) => {
    callback(null, { 
        statusCode: 200, 
        headers: {
            'Access-Control-Allow-Origin': '*'
        }, 
        body: JSON.stringify({
            message: 'PUT'
        })
    });
};

const handleOptions = (callback) => {
    callback(null, {
        statusCode: 200,
        headers: {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Headers': 'origin, content-type, accept',
            'Access-Control-Allow-Methods': 'POST, PUT, OPTIONS'
        }
    });
};

答案 1 :(得分:0)

您可以尝试通过增加Lambda超时来尝试。这解决了我的CORS问题。