Проблема с лямбда-функцией aws и postgres DB - PullRequest
1 голос
/ 31 марта 2019

В этот день у меня проблема с AWS лямбда.Мне нужно искать в RDS postgres db, передавая lambda имя пользователя, но при каждом тестовом событии оно возвращает:

"{
  "errorMessage": "RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 Process exited before completing request"
}"

В частности, это возвращает стек:

START RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 Версия: $ LATEST 2019-03-31T12: 32: 19.572Z 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 TypeError: Путь должен быть строкой.Получено неопределенным в assertPath (path.js: 28: 11) в Object.join (path.js: 1236: 7) в Object.module.exports.getFileName (/var/task/node_modules/pgpass/lib/helper.js:61:16) в module.exports (/var/task/node_modules/pgpass/lib/index.js:10:23) в Соединении.(/var/task/node_modules/pg/lib/client.js:110:9) в emitOne (events.js: 116: 13) в Connection.emit (events.js: 211: 7) в Socket.(/var/task/node_modules/pg/lib/connection.js:125:12) в emitOne (events.js: 116: 13) в Socket.emit (events.js: 211: 7) КОНЕЦ RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 ОТЧЕТ RequestId: 070f76a4-41c6-40d1-8ef2-0a84d9c04af0 Продолжительность: 583,72 мс Биллинг Продолжительность: 600 мс Объем памяти: 128 МБ Макс. Используемая память: 35 МБ
RequestId: 070f76a4-41c6-40d1-8ef-0a84d9c04af0 Процесс завершен до завершения запроса

const AWS = require('aws-sdk');

global.fetch = require('node-fetch');

var Pool = require('pg').Pool;

const psql = new Pool ({

host: '',
user: '',
password: '',
database: 'metadata',
port: 5432
})

function searchUser(username){

return new Promise((resolve, reject) => {

    psql.query("SELECT username FROM utilitator where username LIKE '%$1%'", [username], {

        onSucces: function(res){
            resolve(res.rows);
        },
        onFailure: function(err){
            resolve("err");
        },
    });
});
}

exports.handler = async (event, context, callback) => {
//var body = JSON.parse(event.body);

var username = event.username;

var response = {
    "statusCode": 200,
    "isBase64Encoded": false,
    "body": {},
}

try{
    var result = await searchUser(username).then((result) => {
        return result;
    });

    var statusCode = 200;
    var body = result;
    if(result == "err"){
        statusCode = 400;
        body = "user not found";
    }

    response.statusCode = statusCode;
    response.body = body;

    callback(null,response);
}
catch(e){
    callback(e,{
        "isBase64Encoded": false,
        "headers": {},
        "body": "err",
        "statusCode": 501
    });
}
};

Я ожидаю, что Lambda вернет всех пользователей в БД, которые имеют подобное имя пользователя, которое я передал.

1 Ответ

0 голосов
/ 31 марта 2019

Я просматривал документы node-postgres и не нашел ссылки на события onSuccess и onFailure, а только объекты err и res в обратном вызове (но Возможно, я упустил это из виду):

client.query(text, values, (err, res) => {
  if (err) {
    console.log(err.stack)
  } else {
    console.log(res.rows[0])
    // { name: 'brianc', email: 'brian.m.carlson@gmail.com' }
  }
})

Тем не менее, он также поддерживает версию с обещанием, то есть вам не нужно обещать это самостоятельно:

try {
  const res = await pool.query(text, values)
  console.log(res.rows[0])
  // { name: 'brianc', email: 'brian.m.carlson@gmail.com' }
} catch(err) {
  console.log(err.stack)
}

Это означает, что ваша searchUser функция должна выглядеть следующим образом:

const searchUser = username => {
  return await psql.query('SELECT username FROM utilitator where username LIKE $1', [`%${username}%`])
};

Наконец, в вашем обработчике, поскольку вы уже используете Node 8, вы не должны смешивать обещания и обратные вызовы вместе. Просто верните тело в строковом формате JSON внутри вашего объекта ответа, например так (обработка ошибок для простоты опущена):

exports.handler = async (event) => {
  //const body = JSON.parse(event.body);

  const username = event.username;

  const result = await searchUser(username)

  if (result == "err") {
    return {
      "statusCode": 404,
      "isBase64Encoded": false,
      "body": JSON.stringify({message: 'User not found'}),
    }
  }
  return {
    "statusCode": 200,
    "isBase64Encoded": false,
    "body": JSON.stringify(result),
  }

};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...