2017-03-21 2 views
3

Ich stoße in ein anderes CORS-Problem mit Serverless und AWS. Scheint, ich muss es ausdrücklich sagen, um eine PUT-Methode zu erlauben, aber ich bin mir nicht sicher, wohin dieser Code geht. Ich habe den folgenden Code für meine Lambda-Funktion:CORS Problem mit Serverless und PUT Befehl

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); 
    }); 
}; 

Der Fehler Ich erhalte ist:

XMLHttpRequest nicht https://pwqlomgq89.execute-api.us-east-1.amazonaws.com/dev/timeoffgroup/7d463800-0935-11e7-b618-4b1d72ddca8e?timeOffGroup=Holiday+edited laden kann. Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten -Ressource vorhanden. Herkunft 'http://localhost:9000' ist daher nicht erlaubt Zugriff. Die Antwort hatte den HTTP-Statuscode 502. angular.js: 14328 Möglicherweise nicht behandelte Ablehnung: {"data": null, "status": - 1, "config": {"method": "PUT", "transformRequest": [null], "transformResponse": [null], "jsonpCallbackParam": "Rückruf", "Daten": {}, "url": "https://pwqlomgq89.execute-api.us-east-1.amazonaws.com/dev/timeoffgroup/7d463800-0935-11e7-b618-4b1d72ddca8e", "params": {"timeOffGroup": "Feiertag bearbeitet"} , "headers": {"Übernehmen": "application/json, text/plain, /", "Inhaltstyp": "application/json; charset = utf-8"}}, "statusText": " "}

Ich habe alle Aufrufe auf Serverless-Tutorials verfolgt, um die CORS zu arbeiten. Aber es scheint, ich habe die get und create zu arbeiten, aber der PUT-Befehl funktioniert nicht. Gibt es einen Ort, an dem ich den update-Befehl noch setzen muss, um PUT für domänenübergreifend zu erlauben?

Sieht aus wie ich für eine PUT-Methode Zugriff mehr hier vielleicht brauchen: Header:

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

Der Grund, warum Sie diese Nachricht bestimmten Fehler bekommen sind ist wahrscheinlich nur, dass der Server nicht konfiguriert ist, die Access-Control-Allow-Origin hinzufügen Antwortheader zu Server-Fehlerantworten. Das eigentliche zugrunde liegende Problem, das diese Nachricht anzeigt, ist, dass auf der Serverseite ein 502-Fehler auftritt, der darauf hindeutet, dass ein anderer Fehler auftritt, der nichts mit Ihrer CORS-Konfiguration zu tun hat. Sie möchten wahrscheinlich in Ihren Serverprotokollen nachsehen, um mehr Details darüber zu erhalten, was den 502-Serverfehler verursacht hat, damit Sie das beheben können. Es könnte etwas so einfach wie geringfügige Syntaxfehler sein. – sideshowbarker

+1

Ja, ich schaute auf die Serverprotokolle, es heißt "ValidierungException: Ungültige UpdateExpression: Ein Expression-Attribut Wert im Ausdruck verwendet wird nicht definiert; Attributwert:: timeOffGroupColor" Suchen Sie jetzt nach Tippfehler . –

+0

Ich habe einen undefinierten Wert in JavaScript in die Funktion übergeben. Ich kann das jetzt klären, vielen Dank für die Hilfe. –

Antwort

2

Es scheint, dass Ihr Problem ist, dass Sie die OPTIONS Verb nicht handhaben. Siehe hierzu answer, um mehr über diese Anforderung zu erfahren.

Bevor Sie die Anfrage PUT stellen, wird der Browser eine Anfrage als Sicherheitsmaßnahme ein Preflight OPTIONS Anfrage, um sicherzustellen, dass diese Art von Anfrage vom Server erwartet wird. Wenn Sie OPTIONS nicht unterstützen, wird die Anforderung PUT nicht gestellt.

Um dies zu beheben, ändern Sie Ihre serverless.yml Datei, um OPTIONS Unterstützung hinzuzufügen.

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

Ändern Sie bitte Ihre Griff mit etwas wie folgt aus:

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' 
     } 
    }); 
};