DialogFlow Webhook:错误:EROFS:只读文件系统,打开'.node-xmlhttprequest-sync-2'

时间:2017-11-25 14:11:20

标签: javascript firebase npm xmlhttprequest dialogflow

我正在使用XMLHttpRequest创建DialogFlow应用并使用Cloud Functions for Firebase部署实现。 但是发生了以下错误。

  

错误:EROFS:只读文件系统,打开'.node-xmlhttprequest-sync-2'       在错误(本机)       at Object.fs.openSync(fs.js:642:18)       at Object.fs.writeFileSync(fs.js:1348:33)       at send(/user_code/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:477:10)

我的代码是这样的。

'use strict';

const admin = require('firebase-admin');
const functions = require('firebase-functions');

const DialogflowApp = require('actions-on-google').DialogflowApp; 
const XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
const googleAssistantRequest = 'google';

const Actions = {
  UNRECOGNIZED_DEEP_LINK: 'deeplink.unknown',
  TEST_HTTPREQUEST: 'test.httprequest'
};

const testHttpRequest = app => {
    var req = new XMLHttpRequest();
    req.open('GET', 'http://www.google.com', false);
    req.send(); 
    if (req.status === 200) {
      console.log(req.responseText);
    }
}

const actionMap = new Map();
actionMap.set(Actions.TEST_HTTPREQUEST, testHttpRequest);

exports.mytestapp = functions.https.onRequest((request, response) => {
  const app = new DialogflowApp({ request, response });
  console.log(`Request headers: ${JSON.stringify(request.headers)}`);
  console.log(`Request body: ${JSON.stringify(request.body)}`);
  app.handleRequest(actionMap);
});

有没有人知道如何解决这个错误?

1 个答案:

答案 0 :(得分:0)

您的函数testHttpRequest需要使用app来响应来自Dialogflow的用户请求。使用asktell方法来回复请求。例如,在testHttpRequest中的if语句之后,您可以添加:

app.tell('This response came from Cloud Functions for Firebase!');

告诉Google客户端库上的操作,当您通过Google模拟器上的操作或Google智能助理设备调用助理应用时,将该字符串作为对您请求的响应发送(请参阅Google测试文档上的操作)。

您可能还遇到了动作名称问题。您在此处的履行中引用的操作(deeplink.unknowntest.httprequest)也必须列为an action in an intent in your Dialogflow agent,否则您的代码将永远不会被触发。 Google智能助理还需要一个欢迎意图。默认情况下,Dialogflow中的欢迎意图的操作input.welcome不包含在您的代码中,因此在您匹配代码和Dialogflow代理中列出的操作之前,您的代码可能不会被触发。

此外,外部HTTP呼叫(在Google的网络之外)are not permitted on Cloud Functions without setting up billing first