NodeJS 函数执行耗时540029 ms,完成状态为:'超时'

c2e8gylq  于 2023-02-03  发布在  Node.js
关注(0)|答案(1)|浏览(156)

我创建了一个连接到MQTT代理的云函数我使用了第三方MQTT代理(Mosquito MQTT broker),每次MQTT broker从机器上接收到数据,都会将数据发送到Firebase实时数据库,我是使用GCP控制台编写和部署的,我部署成功,没有出现任何错误,但是在GCP控制台测试的时候,它开始发送数据,但在超时中指定的时间后停止。我尝试了从60到540秒的超时值,但它仍然在指定的时间后停止。我还增加了分配的内存,但它没有解决这个问题,我一直得到相同的超时错误。这是我的代码

const Admin = require("firebase-admin");
const functions = require("firebase-functions");
const mqtt = require('mqtt');
const clientId = 'mqtt_googleserver_********7'
const topic = '#'

const serviceAccount = require("./service.json");

Admin.initializeApp({
  credential: Admin.credential.cert(serviceAccount),
  databaseURL: "https://***************firebaseio.com/"
});

exports.rtdb_mains = functions.https.onRequest((_request, _response) => {
  const client = mqtt.connect('mqtt://**.**.**.****.***',{
    clientId,
    clean: true,
    connectTimeout: 4000,
    username: '******',
    password: '********',
    reconnectPeriod: 1000,
  });
  const db = Admin.database();

  client.addListener('connect', () => {
    console.log('Connected');
    client.subscribe([topic], { qos: 1 });
    console.log(`Subscribe to topic '${topic}'`);
  });

  client.on('message', async (topic, payload) => {
    console.log('Received Message:', topic, payload.toString());
    if (payload.toString() !== "" && topic !== "") {
      const ref = db.ref("All_machines");
      const childref = ref.child(topic.toString());
      await childref.set(payload.toString());
      const topicDetails = topic.split("/");
      const machineId = topicDetails[1];
      const machineParameter = topicDetails[2];

      if (machineParameter === "BoardID") {
        const ref = db.ref(machineParameter);
        await ref.set(machineId);
      }
    }
  });
});

有谁能帮我解决这个问题吗?

jq6vz3qz

jq6vz3qz1#

推送CF on firebase不需要指定service.json,直接使用默认配置即可:

admin.initializeApp();

第二,你使用MQTT实现和cloud函数的方式不正确。你正在监听和等待一个只能由POST或GET请求触发的函数中的消息。我建议使用pub/sub API来做这样的事情,并有一个好的发送/接收消息的实现。
如果您确实需要在MQTT实现中侦听消息,您将需要除Cloud Function之外的其他提供程序,或者调用Cloud Function的原生MQTT
https://cloud.google.com/functions/docs/calling/pubsub
https://www.googlecloudcommunity.com/gc/Serverless/Can-a-cloud-function-subscribe-to-an-MQTT-topic/m-p/402965

相关问题