Javascript 消防基地/电报站请求

Javascript 消防基地/电报站请求,javascript,firebase,express,firebase-realtime-database,telegram,Javascript,Firebase,Express,Firebase Realtime Database,Telegram,我目前正在尝试构建firebase云函数(使用express),其中: -我检查数据库中是否存在使用 -根据电报API是否存在向其发送消息 问题是,当我尝试运行该功能时,Firebase日志能够获取console.log,告诉我用户是否存在,但不会发送到电报。错误日志显示: [2020-02-15T10:41:34.568Z]@firebase/数据库:firebase警告: 用户回调引发了异常。错误:无法在之后设置标题 他们被派去了。 在validateHeader(_http_outgoin

我目前正在尝试构建firebase云函数(使用express),其中: -我检查数据库中是否存在使用 -根据电报API是否存在向其发送消息

问题是,当我尝试运行该功能时,Firebase日志能够获取console.log,告诉我用户是否存在,但不会发送到电报。错误日志显示:

[2020-02-15T10:41:34.568Z]@firebase/数据库:firebase警告: 用户回调引发了异常。错误:无法在之后设置标题 他们被派去了。 在validateHeader(_http_outgoing.js:491:11) 在ServerResponse.setHeader(_http_outgoing.js:498:3) 在ServerResponse.header(/srv/node_modules/express/lib/response.js:771:10) 在ServerResponse.send(/srv/node_modules/express/lib/response.js:170:12) 在ServerResponse.json(/srv/node_modules/express/lib/response.js:267:15) 在ServerResponse.send(/srv/node_modules/express/lib/response.js:158:21) 位于firebase.database.ref.child.once.snapshot(/srv/index.js:59:40) onceCallback(/srv/node_modules/@firebase/database/dist/index.node.cjs:4933:51) at/srv/node_modules/@firebase/database/dist/index.node.cjs.js:4549:22 位于exceptionGuard(/srv/node_modules/@firebase/database/dist/index.node.cjs.js:698:9)

有人能帮忙吗?谢谢大家!

 app.post("/", async (req, res) => {

    const isTelegramMessage =
        req.body &&
        req.body.message &&
        req.body.message.chat &&
        req.body.message.chat.id &&
        req.body.message.from &&
        req.body.message.from.first_name &&
        req.body.update_id;
    const user_id = req.body.message.from.id
 firebase.initializeApp(firebaseConfig);
    let myUser;
    const chat_id = req.body.message.chat.id;
    const {
        first_name
    } = req.body.message.from;
    // Check User Exists
    firebase
        .database()
        .ref("/telegramUsers")
        .child(req.body.message.from.id)
        .once("value", snapshot => {
            if (snapshot.exists()) {
                myUser = true;
                console.log("exists!", myUser);
                return res.status(200).send({
                    method: "sendMessage",
                    chat_id,
                    text: `Welcome Back ${first_name}`
                });
            } else {
                myUser = false;
                console.log("does not exist!");
                return res.status(200).send({
                    method: "sendMessage",
                    chat_id,
                    text: `Hello ${first_name}`
                });
            }
        });

    return res.status(200).send({
        status: "not a telegram message"
    });
});

正如其他人所评论的,您正在返回并向调用方写入两次响应。由于
send
开始写入HTTP响应的主体,因此在之前已在
res
上调用了
status
(甚至
send
)之后,您无法调用它

在这样的代码中:

 app.post("/", async (req, res) => {

    const isTelegramMessage =
        req.body &&
        req.body.message &&
        req.body.message.chat &&
        req.body.message.chat.id &&
        req.body.message.from &&
        req.body.message.from.first_name &&
        req.body.update_id;
    const user_id = req.body.message.from.id
    firebase.initializeApp(firebaseConfig);
    let myUser;
    const chat_id = req.body.message.chat.id;
    const {
        first_name
    } = req.body.message.from;
    // Check User Exists
    if (isTelegramMessage) {
      return firebase
        .database()
        .ref("/telegramUsers")
        .child(req.body.message.from.id)
        .once("value")
        .then(snapshot => {
            if (snapshot.exists()) {
                myUser = true;
                console.log("exists!", myUser);
                return res.status(200).send({
                    method: "sendMessage",
                    chat_id,
                    text: `Welcome Back ${first_name}`
                });
            } else {
                myUser = false;
                console.log("does not exist!");
                return res.status(200).send({
                    method: "sendMessage",
                    chat_id,
                    text: `Hello ${first_name}`
                });
            }
          });
    } else {
      return res.status(200).send({
        status: "not a telegram message"
      });
   }
});
这些变化:

  • 现在仅在
    isTelegramMessage
    为true时检查用户是否存在
  • 现在返回数据库读取操作的结果
  • 使用
    once().then()
    ,以便
    返回res.status().send()…
    冒泡。这确保了在数据库加载和响应发送完成之前,云函数不会终止函数

虽然HTTPS触发的云函数并不严格需要第二个和第三个项目符号(因为它们在您发送响应时终止),但我仍然建议使用它们,为了便于移植/复制,请将代码粘贴到由其他事件触发的云函数类型。

在发送消息之前返回,然后在最后一次
返回之前返回againwrite console.log(),您将了解问题所在。您将得到两个日志-一个是“存在”,另一个是您将要编写的日志