Как правильно ответить на запрос axios к AWS API Gateway - PullRequest
2 голосов
/ 12 марта 2019

В настоящее время я пытаюсь настроить лямбду AWS, которая помещает записи в базу данных mysql.При вызове ответственного API через запрос axios лямбда запускается и завершается без ошибок.

Лямбда:

exports.registerUser = async (event,contex,callback) => {
data = JSON.parse(event.body)
console.log(data)

con = mysql.createConnection({
    host: "host",
    user: "name",
    password: "password",
    database: 'component'

  });
await con.connect(function(err) {
    if (err) {
      console.log(err)
      throw err;
    }     
    console.log("Connected!");
})

var timestamp = Date.now();
id_user =uuidv4();
var sql_user = "INSERT INTO user (id_user, first_name, last_name, email, city, registration) VALUES ('"+id_user+"', '"+data.first_name+"', '"+data.last_name+"', '"+data.email+"', '"+data.city+"', "+timestamp+")"
await new Promise(function(resolve,reject){
    con.query(sql_user, function (err, result) {
        if (err) return reject(err);
        console.log("1 record inserted");
        resolve(result)
    });
}) 
await con.end(function(err) {
    if (err) {
      console.log(err)
      throw err;
    }     
    console.log("Disonnected!");
})


console.log('SUCCESS')
return callback(null, 'success')

}

Однако на клиентесторона, в которой запрос axios всегда возвращает 502.

Клиент:

cloud.registerNode = async function(event, callback){
axios.post(API, JSON.stringify({
    id_user: event.id_user,
    edge_uuid: event.edge_uuid, 
    edge_name: event.edge_name, 
    edge_key: event.edge_key, 
    cloud_key: event.cloud_key

})).then(function(response){
    console.log('It worked with response:')
    console.log(response)

}).catch(function(err){
    console.log('error thrown:')
    console.log(err)
})

}

Я подозреваю, что обратный вызов не является правильным путем, но яЯ не уверен, как это сделать правильно.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Отбросьте обратный вызов, ваша лямбда-функция асинхронна. Вы можете вернуть его как:

return {
  statusCode: 200,
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify('Success')
}

Для случаев, когда вы знаете, что запрос неверен, вы можете сделать:

return {
  statusCode: 400,
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify('Bad Request')
}
0 голосов
/ 12 марта 2019

В настоящее время я делаю нечто похожее с базой данных DynamoDB и использую следующий код для вызова шлюза API для запуска моей POST-лямбды:

  handleSubmit = (event) => {
    event.preventDefault();
    console.log('state', this.state);

    const { records, record, album, artist, date, imageUrl } = this.state;
    const newRecord = { record, album, artist, date, imageUrl };

    fetch("https://vv2qx5zqb7.execute-api.us-east-1.amazonaws.com/Dev", {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },      
      body: JSON.stringify({records: record, album, artist, date, imageUrl})
    });

Это то, как Amazon описывает использование асинхронности, https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-logging.html

console.log ('Функция загрузки');

exports.handler = async function(event) {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('value1 =', event.key1);
    console.log('value2 =', event.key2);
    console.log('value3 =', event.key3);
    return event.key1 // Echo back the first key value   
};
...