Как сохранить данные в хранилище из ответа на внешний API

Мы используем облачные функции firebase для выполнения наших задач и внешний API-интерфейс rest для наших необработанных операций.

У нас есть одно намерение с несколькими последующими действиями, и это выглядит так

 - Create Note
 - - Create Note - fallback*
 - - - Create Note - fallback - yes
 - - - Create Note - fallback - no

* the fallback allows us to capture free text

В нашем webhook есть следующее выполнение

app.intent("Create Note", (conv) => {
    if (!conv.user.storage.note) conv.user.storage.note = {};
    conv.ask("Go ahead, talk to Talkatoo!");
});

app.intent("Create Note - fallback", (conv) => {
    conv.user.storage.input = conv.input.raw;

    let response = conv.user.storage.note
         ? conv.user.storage.note.body.concat(conv.input.raw)
         : conv.user.storage.input;

    conv.ask("So far this is what I heard you say, let me know if this is complete. ", response);
});

app.intent("Create Note - fallback - yes", (conv) => {
    // based on the conv.user.storage.note object
    // either make a call to create a note or update a note

    // make call to external api and based on the response 
    // set the value for conv.user.storage.note

   conv.ask("Great news, let me save that for you!");
});

app.intent("Create Note - fallback - no", (conv) => {
    // based on the conv.user.storage.note object
    // either make a call to create a note or update a note

    // make call to external api and based on the response 
    // set the value for conv.user.storage.note

    // Send the user back to Create Note to capture the rest of their input
   conv.followup("my_custom_event");
});

Проблема в том, что conv.user.storage.note устанавливается, когда я получаю ответ от API, но затем он сбрасывается на пустой, поэтому каждый раз создается новая заметка. Я пытаюсь добавить различные данные, полученные от пользователя, в одну заметку.


person islalobo    schedule 22.02.2019    source источник


Ответы (2)


На основе ...

app.intent("Create Note - fallback - yes", (conv) => {
    // based on the conv.user.storage.note object
    // either make a call to create a note or update a note

    // make call to external api and based on the response 
    // set the value for conv.user.storage.note

   conv.ask("Great news, let me save that for you!");
});

похоже, что либо вы еще не написали код для вызова API, либо удалили этот код до того, как разместили его в StackOverflow. Это правильно?

Можете ли вы обновить свой вопрос, чтобы показать, где и как вы отправляете HTTP-запрос на внешний REST API?

person Max Wiederholt    schedule 25.02.2019
comment
Отправляю с использованием request-promise. Я включил псевдокод, потому что вам не нужно видеть вызов; это просто основной вызов. На основании этого сообщения stackoverflow.com/a/52450347/4122445 и нескольких других похожих ответов пользователя Prisoner, похоже, что есть - это обходные пути для работы с асинхронными вызовами и ответа пользователю. В нашем случае я понял, что диалог не зависит от каких-либо данных, возвращаемых из ответа, поэтому я могу вместо этого сохранить несколько входных данных пользователя в user.storage, а затем, когда они будут завершены, сохранить полный ответ. - person islalobo; 25.02.2019
comment
Кроме того, проблема заключалась в том, что conv.user.storage.note устанавливался, но не получал СБРОС, на самом деле ответ, т.е. conv.followup (my_custom_event) выполняется первым. Я должен был уловить это, просто взглянув на свой код. - person islalobo; 25.02.2019

Для тех, кому это может помочь, я нашел сообщение и понял, что обработка ответов на асинхронные вызовы может потребовать дополнительных размышлений (для работы с обходными решениями) Как выполнять асинхронные вызовы от внешних служб к действиям в Google?

Для нашего варианта использования нам не нужны были данные ответа, т.е. нам не нужно было передавать какие-либо данные ответа пользователю, поэтому вместо этого мы сохранили несколько вводов пользователя в user.storage, а когда они были завершены, мы сохраняем полный ответ.

app.intent("Intent - fallback", (conv) => {
    conv.user.storage.input = conv.user.storage.input
    ? conv.user.storage.input.concat(conv.input.raw)
    : conv.input.raw;

    conv.ask("Is that complete or would you like to continue?");
});

app.intent("Intent - fallback - yes", (conv) => {

    createNote(conv); <--- makes call to save

    conv.ask("Great news, let me save that for you!");
});

app.intent("Intent - fallback - no", (conv) => {
    conv.followup("my_custom_event");
});
person islalobo    schedule 25.02.2019