Используйте пакет request-обещание-native во встроенном редакторе DialogFlow - PullRequest
0 голосов
/ 23 июня 2018

Я делаю POST-запрос к веб-сервису.Код для запроса POST хранится в отдельной функции. Вызов функции из моей функции-намерения во внешнюю функцию является асинхронным. Так что я использую Promises для достижения синхронности. Проблема здесь заключается в том, что когда я импортирую request-promise-native внутри моей строкиредактор выдает ошибку как TypeError: Cannot read property 'prototype' of undefined.

Но когда я попробовал это на моей локальной рабочей станции с версией js узла 9.11.1, она работала нормально. Версия Node JS в DialogFlow - >=6.0.к нему нужно добавить другую зависимость?

Кто-нибудь может объяснить, почему это происходит?

ОБНОВЛЕНИЕ: Я изменил механизм узла на 6.14.3 и зависимость для модуля’quest-обещания-native 'в package.json как "request-promise-native":"v1.0.5". Но все равно не повезло. Ниже приведен мой код:

var doco;
 var rp = require('request-promise-native');
 var myJSONObject = {
  "inputs" : [  {
    "name" : "<name>",
    "value" : <value>
  } ]
};
var orchName = 'TEST05';
  postData = JSON.stringify(myJSONObject);
 return networkCall(postData,orchName).then((response)=>{
			console.log('response is'+response)            
             console.log("+++++++++++++=DOCO=+++++++++ "+response);
             doco = doco1;
             //agent.add(`Order number is ${doco1}`);
             
        }).catch((response) => {
      console.log(`ERROR: `+response);
    });
	
console.log('doco'+doco);	

function networkCall(postData, orchName) {
    return new Promise((resolve,reject) =>{
      var options = {
  method: 'post',
  uri: '<URL>',
  body: myJSONObject,
  auth: {
        'user': 'usr',
        'pass': 'pwd'
      },
  json: true
};
return rp( options )
  .then( body => {
	 // var test = JSON.stringify(body)
	 var doco =body.ServiceRequest1.subforms.z_DOCO_137.value;
	console.log('DOCO '+doco);
    resolve( doco );
  })
  .catch( err => {
	  console.log('FAILED'+err);
    reject( err );
  });
    });
}

Ошибка выдается при развертывании кода в встроенном редакторе. Ошибка:

The deployment of your Cloud Function failed:
Function load error: Code in file index.js can't be loaded.
Is there a syntax error in your code?
Detailed stack trace: TypeError: Cannot read property 'prototype' of undefined
at module.exports (/user_code/node_modules/request-promise-native/node_modules/request-promise-core/configure/request2.js:34:47)
at Object.<anonymous> (/user_code/node_modules/request-promise-native/lib/rp.js:15:1)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/user_code/index.js:17:23)

1 Ответ

0 голосов
/ 24 июня 2018

Для пакета request-promise-native требуется пакет request в качестве взаимозависимости. Поэтому вам нужно явно добавить это на вкладку package.json в редакторе Dialogflow.

enter image description here

Вот тот package.json, который работает для меня:

{
  "name": "dialogflowFirebaseFulfillment",
  "description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "~6.0"
  },
  "scripts": {
    "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
    "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
  },
  "dependencies": {
    "actions-on-google": "2.0.0-alpha.4",
    "firebase-admin": "^4.2.1",
    "firebase-functions": "^0.5.7",
    "dialogflow": "^0.1.0",
    "dialogflow-fulfillment": "0.3.0-beta.3",
    "request-promise-native": "^1.0",
    "request": "^2.87"
  }
}

Не забывайте, что в дополнение к правильному пакету вам потребуется обновить проект до платной учетной записи. Бесплатный план Firebase "Spark" не разрешает доступ к сети за пределами сети Google. Вы можете перейти на тарифный план «Blaze», который является платным, но имеет бесплатный уровень, достаточный для большинства целей разработки и тестирования.

...