【问题标题】:How to append data to firebase in dialogflow fulfillment using nodejs?如何使用nodejs在对话流履行中将数据附加到firebase?
【发布时间】: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”的值来自不同的意图。

标签: node.js firebase firebase-realtime-database dialogflow-es dialogflow-es-fulfillment


【解决方案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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2017-01-16
    相关资源
    最近更新 更多