Node.js pg承诺Azure函数写入Postgres(timescaleDB)



Azure又把我逼疯了。我试图实现的是,通过事件中心输入的数据需要写入数据库。到目前为止,我所做的工作是数据到达事件中心,Azure功能能够将数据发布到数据库。我更喜欢用Node.JS来做这件事,因为在Azure中集成似乎很好。我用来向数据库发送一些伪造数据的脚本如下:

module.exports = async function (context, eventHubMessages){
const initOptions = {
query(e) {context.log(e.query)},
capSQL: true
//capSQL: true // capitalize all generated SQL
};
const pgp = require('pg-promise')(initOptions);
const db = pgp({
host: '####',
user: '####',
password: '####',
database: 'iotdemo',
port: 5432,
ssl: true
});
// our set of columns, to be created only once (statically), and then reused,
// to let it cache up its formatting templates for high performance:
const cs = new pgp.helpers.ColumnSet(['customer', 'tag', 'value', 'period'], {table: 'testtable'});
// generating a multi-row insert query:
const query = pgp.helpers.insert(JSON.parse(eventHubMessages), cs);
//=> INSERT INTO "tmp"("col_a","col_b") VALUES('a1','b1'),('a2','b2')
// executing the query:
db.none(query);
};

是的,这是一段来自其他地方的片段。"eventHubMessages"应包含有效负载。到目前为止,我遇到的几个问题是:

  • 我可以发送脚本中定义的有效负载,或者在给它测试有效负载的同时,但我不能发送实际消息的有效负载
  • pg promise无论是否失败都会返回一个202,因此调试目前是"盲目的"。任何关于如何获得正确日志记录的提示都将不胜感激
  • 我在事件中心实例中使用了"捕获事件"来捕获实际消息。这些存储在blob存储中。在注意到格式是Avro。我需要剥离那个对象才能得到实际的数组吗

输入应该看起来像这样:

[{"customer": duderino, "tag": nice_rug, "value": 10, "period": 163249839}]

我想我有两个问题:

  1. 我不知道如何使用Node.JS从Azure功能中获得有意义的注销
  2. 关于我的有效载荷是如何进入的,有些问题

一个更深入的问题是,我如何知道Azure功能是否获得了它应该获得的数据。我知道事件网格获取数据,但没有吞吐量。命名空间是一致的,Azure函数应该由该命名空间触发,并将输入作为字符串获取。

我迷失了方向,不知所措。除了解决方案之外,我还希望能对我的请求提供反馈。我不是StackOverflow的专业人士,不想浪费你的时间。

问候

好的,所以经过一些挖掘,我找到了一些解决问题的方法。首先,我以字符串的形式接收有效负载,这意味着我需要先对其进行解析,然后才能使其成为可调用对象。就代码而言,它很简单,并且是node.js 的部分基本函数

var parsed_payload = JSON.parse(payload_that_is_a_string);

最后,为了获得有意义的日志记录,我发现PG Promise模块对此有很大的支持,并且可以在加载模块本身时进行配置。我对错误特别感兴趣,所以我启用了这样的选项:

const initOptions = {
query(e) {console.log(e.query)},
capSQL: true,
//capSQL: true // capitalize all generated SQL
error: function (error, e) {
if (e.cn) {
// A connection-related error;
// console.log("DC:", e.cn);
// console.log("EVENT:", error.message);
}
}
};

然后可以将其用作加载PG Promise的设置对象:

const pgp = require('pg-promise')(initOptions);

谢谢你考虑我的求助。我希望这对任何人都有用!

尊敬的Pieter

最新更新