node.js - AWS Lambda NodeJS 连接到 RDS Postgres 数据库

标签 node.js postgresql amazon-web-services aws-lambda

我正在尝试测试我的 Lambda 和 RDS 实例之间的连接。我将它们都放在同一个私有(private)子网上,所有端口都在安全组中打开。当我触发 Lambda 时,我确实看到在 RDS 实例上打开了一个连接。但是,Lambda 在 4 分 40 秒后超时。 PG 环境变量在 Lambda 配置中设置。

const { Client } = require('pg');
const client = new Client();

var hello = [
  { name: 'test', description: 'testerface' }
];

exports.handler = async (event, context, callback) => {
    // Postgres Connect
    client.connect();
    const res = client.query('SELECT $1::text as message', ['Hello world!']);
    console.log(res);
    var response = {
        "statusCode": 200,
        "headers": {
            "Content-Type" : "application/json"
        },
        "body": JSON.stringify(hello),
        "isBase64Encoded": false
    };
    callback(null, response);
};

我怎样才能从 Lambda 日志中的连接返回响应 - 或者在响应正文中获得更好的响应?

最佳答案

您需要更好地处理客户端连接。这意味着捕获客户端可能通过的任何异常并正确释放连接。此代码会将查询的输出返回到响应正文:

const pg = require('pg')
const pool = new pg.Pool()

async function query (q) {
  const client = await pool.connect()
  let res
  try {
    await client.query('BEGIN')
    try {
      res = await client.query(q)
      await client.query('COMMIT')
    } catch (err) {
      await client.query('ROLLBACK')
      throw err
    }
  } finally {
    client.release()
  }
  return res
}

exports.handler = async (event, context, callback) => {
    try {
      const { rows } = await query("select * from pg_tables")
      console.log(JSON.stringify(rows[0]))
      var response = {
          "statusCode": 200,
          "headers": {
              "Content-Type" : "application/json"
          },
          "body": JSON.stringify(rows),
          "isBase64Encoded": false
      };
      callback(null, response);
    } catch (err) {
      console.log('Database ' + err)
      callback(null, 'Database ' + err);
    }
};

关于node.js - AWS Lambda NodeJS 连接到 RDS Postgres 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982115/

相关文章:

javascript - 当加载到内存中的 var 时,磁盘上的 JSON 文件是否占用相同的空间量?

node.js - vuex物理存放在哪里?

javascript - 获取lodash中存在的所有函数

ruby-on-rails - 远程服务器上的 Postgres 语言环境错误

postgresql - 如何插入UUID的值?

node.js - 更新在 shell 中工作但不在 Nodejs 驱动程序中工作的查询

entity-framework - 在 postgres 中删除 SET NULL

amazon-web-services - 在现有 s3 存储桶上启用默认加密是否需要对存储桶用户进行任何 IAM 更改?

amazon-web-services - 使用 CloudFormation 在 RDS 中创建事件订阅

node.js - 将 MEAN Stack 应用程序部署到 AWS EC2 时设置环境变量