Javascript 消防基地/电报站请求
我目前正在尝试构建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) 有人能帮忙吗?谢谢大家!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
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"
});
}
});
这些变化:
- 现在仅在
为true时检查用户是否存在isTelegramMessage
- 现在返回数据库读取操作的结果
- 使用
,以便once().then()
冒泡。这确保了在数据库加载和响应发送完成之前,云函数不会终止函数返回res.status().send()…
虽然HTTPS触发的云函数并不严格需要第二个和第三个项目符号(因为它们在您发送响应时终止),但我仍然建议使用它们,为了便于移植/复制,请将代码粘贴到由其他事件触发的云函数类型。在发送消息之前返回,然后在最后一次
返回之前返回againwrite console.log(),您将了解问题所在。您将得到两个日志-一个是“存在”,另一个是您将要编写的日志