【问题标题】:how to use node pg in AWS Lambda?如何在 AWS Lambda 中使用节点 pg?
【发布时间】:2025-12-12 09:40:01
【问题描述】:

UPDATE/SOLVED ...问题是 pgpass 插件正在寻找 $HOME/.pgpass,而 $HOME 未在 lambda 上定义,导致 join(undefined, '.pgpass') 失败。真的不值得把答案归功于自己....

我在 lambda 处理程序中有以下测试代码(从 typescript 编译):

const db = new Pool()
const {rows} = await db.query('select 1 as x')
console.log('rows', JSON.stringify(rows))

连接是通过环境中的 PGHOST PGPORT PGUSER PGDATABASE 创建的。我知道配置“几乎正确”,因为我第一次尝试时得到:

{"errorMessage":"error: no pg_hba.conf entry for host \"10.1.1.249\", 用户 \"foo\",数据库 \"bar\",SSL 关闭\n at Connection.parseE (/var/task/handler.js:9209:11)\n 在 Connection.parseMessage (/var/task/handler.js:9034:19)\n 在 插座。 (/var/task/handler.js:8777:22)\n 在 emitOne (events.js:96:13)\n 在 Socket.emit (events.js:188:7)\n 在 可读AddChunk (_stream_readable.js:176:18)\n at TCP.onread 处的 Socket.Readable.push (_stream_readable.js:134:10)\n (net.js:547:20)"}

这似乎充满希望。我将 postgres 配置更改为允许来自子网,然后再次尝试。但是,现在我得到了:

2018-02-06 18:14:21.183 (-05:00)    76761ca5-0b93-11e8-8783-a74d098c9f4a    select
2018-02-06 18:14:21.202 (-05:00)    76761ca5-0b93-11e8-8783-a74d098c9f4a    TypeError: Path must be a string. Received undefined
    at assertPath (path.js:7:11)
    at Object.join (path.js:1211:7)
    at Object.module.exports.getFileName (/var/task/handler.js:32434:16)
    at module.exports (/var/task/handler.js:32355:23)
    at Connection.<anonymous> (/var/task/handler.js:31255:9)
    at emitOne (events.js:96:13)
    at Connection.emit (events.js:188:7)
    at Socket.<anonymous> (/var/task/handler.js:8781:12)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
END RequestId: 76761ca5-0b93-11e8-8783-a74d098c9f4a

发生了什么事?好像它第一次到达数据库并连接了......现在它在query 上失败了。有什么我应该使用的选项吗?

【问题讨论】:

  • 请展示您的处理程序源代码。因为我们看不到您何时/如何连接到与您的处理程序函数相关的数据库。打字稿很好。
  • @dashmug 处理程序只是包装发布的行。连接在调用查询时被隐式处理。 (见github.com/brianc/node-pg-pool#your-new-favorite-helper-method)所有参数都在环境中。
  • 试过console.log(process.env.PGHOST)看环境变量有没有设置好?
  • 是的...打印出process.env,它包括PGHOST等。PGHOST是IP地址(不是主机名),但这应该可以。
  • 您应该相信自己的答案。解决了我的问题。

标签: node.js amazon-web-services aws-lambda node-postgres


【解决方案1】:

首先,您不会调用 pool.connect 从池中获取客户端。

其次,AWS Lambda does not support async functions 上的当前 Node.js 运行时 6.10。 (除非您直接使用 Babel 或其他使用 Babel 的样板,例如 es2017-lambda-boilerplate 将代码转换为 ES5)

话虽如此,您必须使用回调或承诺(then/catch)。例如:

const {Pool} = require("pg");

const db = new Pool({
  host: "localhost",
  user: "database-user",
  // ... rest of config options
});

db.connect((err, client, release) => {
  if (err) {
    console.error("Error acquiring client.", err.stack);
  } else {
    client.query("SELECT 1 AS x", (err, result) => {
      release();
      if (err) {
        console.error("Error executing query.", err.stack);
      } else {
        console.log(result.rows);
      }
    })
  }
})

【讨论】:

  • (1) 无需调用 connect -- 将在pool.query() 上自动连接 (2) 事实上,使用 typescript 所以异步不是问题(如果是的话会导致语法错误)。由于它尝试连接,因此这些问题不是问题。错误似乎是包装器要求来自没有文件名的 tcp 套接字的文件名。 (但为什么?)