如何使用nodejs在对话流履行中将数据附加到firebase?

Posted

技术标签:

【中文标题】如何使用nodejs在对话流履行中将数据附加到firebase?【英文标题】:How to append data to firebase in dialogflow fulfillment using nodejs? 【发布时间】:2020-09-14 09:27:50 【问题描述】:

我正在尝试将新数据字段添加到 firebase 实时数据库中的现有列表中。我正在使用 push() 在我的一个函数中生成唯一 ID。 在下一个函数中,如何将新数据映射到相同的唯一 ID 下,以便将新数据附加到相同的 ID 下。 以下是实现代码:

function reportHandler(agent)
 const t2 = agent.parameters.name;
 const t3 = agent.parameters.college;
 const t4 = agent.parameters.branch;
 const t5 = agent.parameters.year;

 return admin.database().ref('data').push().set(
  name: t2,
  college: t3,
  branch: t4,
  year: t5
);

此代码完美运行,并在数据库中创建了一个唯一的 ID 字段。我接下来要做的是将新数据添加到之前创建的唯一 ID 字段中。

function detailsHandler(agent)
 const t1 = agent.parameters.prtype;
 const t6 = agent.parameters.desc;
 const t7 = agent.parameters.when;

 return admin.database().ref('data').push().set(
  prtype: t1,
  desc: t6,
  when: t7
);

这是另一个具有一些值的函数。我希望将这两个函数中的值放入一个具有唯一 ID 的字段中。

我用这个调用函数

let intentMap = new Map();
intentMap.set('Report', reportHandler);
intentMap.set('Report.details', detailsHandler);
agent.handleRequest(intentMap);

创建了具有唯一 ID 的新字段,但其值仅来自第一个函数

这就是我想要的(将两个函数的值放到一个字段中)

【问题讨论】:

要清楚(因为这是标记为 dialogflow) - 这两个更新将在不同的 Intent 处理程序中完成?所以你没有从同一个 Intent 中得到“name”和“desc”的值,对吗? (如果这个假设不正确 - 显示有问题的 Intent,以及您如何注册处理程序,或者如何调用这些函数,将帮助我们帮助您。) 是的,它们是两个不同的意图处理程序。 “name”和“desc”的值来自不同的意图。 【参考方案1】:

您可以将您的问题分为两部分:

我们如何根据 ID 更新记录? 第二个 Intent Handler 如何知道要更新什么 ID?

我们如何根据 ID 更新记录?

您不能使用push() 方法,因为这会将数据保存在新的 ID 中。您也不想使用set() 方法,因为此替换 ID 处的数据为新数据。

相反,您希望使用 ID 获取对记录的引用,然后使用 update() 方法获取 update it。

如果我们假设我们的 ID 在一个名为 id 的变量中,这可能看起来像这样

const ref = admin.database().ref('data').child(id);
return ref.update(
  prtype: t1,
  desc: t6,
  when: t7
);

但是我们从哪里获得 ID?

我们如何将 ID 从第一个 Intent Handler 传递给第二个?

ID 是在我们在第一个 Intent Handler 中调用 push() 时生成的,因此我们需要在此时捕获它。

但要将其传递给第二个 Intent Handler,我们需要使用 agent.context.set() 方法将其保存在 context parameter 中。 set() 方法采用上下文的名称、可选的生命周期(将为此保存多少 Intent 调用)和包含属性/值字符串的对象。

这可能看起来像这样:

const dataRef = admin.database().ref('data');
const newRef = dataRef.push();
const id = newRef.key;
return newRef.set(
  name: t2,
  college: t3,
  branch: t4,
  year: t5
)
.then( () => 
  agent.context.set(
    name: "reportInfo",
    lifespan: 5,
    parameters: 
      id: id
    
  );
);

稍后,在您的第二个 Intent 处理程序中,您将使用 agent.context.get() 从上下文中获取此 ID,然后从中获取 id 参数。所以可能是这样的:

const reportInfoContext = agent.context.get('reportInfo');
const id = reportInfoContext.parameters.id;

然后按照上面的说明使用它。

【讨论】:

以上是关于如何使用nodejs在对话流履行中将数据附加到firebase?的主要内容,如果未能解决你的问题,请参考以下文章

在NodeJS中将可读流关闭到FIFO

在Nodejs中将流解析为对象

如何在 Robot Framework 中将数据附加到 csv 文件?

无法在 NodeJS 中将字符串转换为 ObjectId

无法在 NodeJS 中将字符串转换为 ObjectId

如何在 pandas 中将新类别附加到 HDF5?