对于我的Google Assistant / Dialogflow项目,我试图拦截firebase-functions端点发送回Dialogflow的每个响应。我可以轻松地拦截请求,但是响应是在多个函数中构建的(每个Intent一个函数),并且我不想在每个函数中都包含一个拦截器。
是否可以使用中间件,或者在发送响应时提供回调,为每个响应提供全局拦截器?
我在文档中找到了以下内容:https://firebase.google.com/docs/functions/http-events#use_middleware_modules_with
但是,我不确定会去哪里。请注意,我没有使用自定义快速设置,而是直接在firebase上使用本机实现。
答案 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方法并在新方法中返回值。