Как добавить данные в firebase при выполнении диалогового процесса, используя nodejs? - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь добавить новые поля данных в существующий список в базе данных firebase realtime. Я использую pu sh () для создания уникального идентификатора в одной из моих функций. В следующей функции показано, как сопоставить новые данные с тем же уникальным идентификатором, чтобы новые данные добавлялись под тем же идентификатором. Ниже приведен код выполнения:

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
});

Этот код отлично работает и создает уникальное поле идентификатора в базе данных. Что я хочу сделать дальше, так это добавить новые данные в ранее созданное поле уникального идентификатора.

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
});

Это еще одна функция, которая имеет некоторые значения. Мне нужны значения из обеих функций в одно поле с уникальным идентификатором.

Я вызываю функции с этим

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

Новое поле с уникальным идентификатором создается, но со значениями только из первой функции
enter image description here

Это то, что я хочу (значения из обеих функций в одну поле)
enter image description here

1 Ответ

0 голосов
/ 27 мая 2020

Вы можете разбить свой вопрос на две части:

  • Как мы обновляем запись с учетом ее ID?
  • Как второй обработчик намерений узнает, какой идентификатор обновлять?

Как обновить запись с учетом ее идентификатора?

Вы не можете использовать метод push(), так как он сохранит данные в новый ID. Вы также не хотите использовать метод set(), поскольку этот заменяет данные в идентификаторе новыми данными.

Вместо этого вы хотите получить ссылку на запись с ID, а затем обновите его с помощью метода update().

Если мы предположим, что наш идентификатор находится в переменной с именем id, это может выглядеть примерно так

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

Но откуда мы берем идентификатор?

Как передать идентификатор от первого обработчика намерений второму?

Идентификатор генерируется, когда мы вызываем push() в нашем первом обработчике намерений, поэтому нам нужно захватить его в этот момент.

Но чтобы передать его второму обработчику намерений, нам нужно сохранить его в a параметр контекста с использованием метода agent.context.set(). Метод 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
    }
  });
});

позже, во втором обработчике намерений, вы получите этот идентификатор из контекста, как вы догадались, agent.context.get(), а затем получите от него параметр id. Так что, возможно, что-то вроде этого:

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

, а затем используйте это, как описано выше.

...