拦截Firebase功能响应(中间件)

时间:2018-11-29 10:57:16

标签: firebase google-cloud-functions dialogflow

对于我的Google Assistant / Dialogflow项目,我试图拦截firebase-functions端点发送回Dialogflow的每个响应。我可以轻松地拦截请求,但是响应是在多个函数中构建的(每个Intent一个函数),并且我不想在每个函数中都包含一个拦截器。

是否可以使用中间件,或者在发送响应时提供回调,为每个响应提供全局拦截器?

我在文档中找到了以下内容:https://firebase.google.com/docs/functions/http-events#use_middleware_modules_with

但是,我不确定会去哪里。请注意,我没有使用自定义快速设置,而是直接在firebase上使用本机实现。

4 个答案:

答案 0 :(得分:1)

由于您正在使用带有Firebase的Dialog Flow来实现,所以我希望您也使用actions-on-google软件包。

serialize()是被调用以生成响应的函数。您可以覆盖此功能并拦截请求和响应。尝试这段代码,稍后再谢谢。 ?

app.middleware((conv) => {
  const serializeCopy = conv.serialize;
  conv.serialize = () => {
    const response = serializeCopy.call(conv);
    console.log(conv.request, response);
    return response;
  };
});

答案 1 :(得分:0)

Cloud Functions不公开用于HTTP请求或响应的任何中间件或拦截器。您可能必须自己构建一些东西,可能要使用自己构建的Express应用程序。您可以在Cloud Functions上托管Express应用。

答案 2 :(得分:0)

我想要类似的东西来记录日志来回拦截所有对话。我最终编写了一个用于发送对话的功能。例如:

const intercept = (conv, sentence) => {
  //My Interceptor code
  conv.ask(sentence)
}

现在,无论何时我想发送回复,我都会使用:

intercept(conv, "Speak this")

答案 3 :(得分:0)

serialize()方法在返回响应之前就在对话上被调用,因此您可以做的是扩展对话对象(基于您使用的库)并覆盖serialize方法以执行所需的任何操作做。不要忘了调用原始的serialize方法并在新方法中返回值。