我当前正在编写一个动作,作为动作的一部分,检查并增加orderID值,并在对话中进行响应。

该代码当前有效,但是部分执行过程可能需要10秒钟的时间才能执行,这可能会使Google行动超时并导致请求失败(以及响应速度慢(如果有的话))。我正在使用runTransaction来确保Firebase上没有其他函数实例也可以递增ID。代码全部起作用,并且值确实增加,但是函数响应中的延迟表示它正在响应的意图超时并给出后退响应。

正如您在下面的代码中看到的那样,我添加了各种console.log来跟踪延迟,它是在before transactiontransaction started之间被输出到控制台,发生了8-10秒的延迟。谁能说为什么?

const functions = require('firebase-functions');
const { dialogflow, Suggestions } = require('actions-on-google');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);
const db = admin.firestore();
const settings = {timestampsInSnapshots: true};
db.settings(settings);

const app = dialogflow();

app.intent('order', (conv, {givenname: givenname}) => {
  console.log('starting function');
  return new Promise(function(resolvei, rejecti){
    if(givenname !== undefined){

        console.log('before db.collection');

        var idRef = db.collection('orderIDs').doc('opho9peCy54tjLR0YmVm');
        console.log('before transaction');
        var transaction = db.runTransaction(t => {
          console.log('transaction started');
          return t.get(idRef)
            .then(doc => {
              console.log('data gotten');
              var id = doc.data().ID + 1;
              if(id > 99){
                id = 1;
              }
              t.update(idRef, {ID: id});
              console.log('update made');
              return Promise.resolve(id);
            });
        }).then(result => {
          console.log(result);
          conv.close('Thank you, ' + givenname + '. Your order number is ' + result + '.');
          resolvei();
        }).catch(err => {
          console.log('Transaction failure:', err);
          rejecti();
        });
      }
    else{
      conv.close('Oops, something has gone wrong, try again.');
      resolve();
    }
  });
});

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

最佳答案

我注意到,第一次运行已部署的功能时,runTransaction速度很慢,大约需要4.5秒才能完成(即使您在事务功能中不做任何工作)。在那之后,单独运行runTransaction会更快,并且需要不到200毫秒的时间才能完成。几乎就像您第一次运行新部署的功能时,针对可事务处理功能进行了一些额外的云管理。

09-05 16:19