Javascript FIREBASE警告Can';t在发送邮件后设置邮件头
当数据被推送到数据库时,我会使用数据流自动更新我的角度材料数据表 这是我的路由器Javascript FIREBASE警告Can';t在发送邮件后设置邮件头,javascript,node.js,firebase,express,Javascript,Node.js,Firebase,Express,当数据被推送到数据库时,我会使用数据流自动更新我的角度材料数据表 这是我的路由器 router .route("/") .get(function (req, res, err) { // Get a database reference to our posts var db = admin.database(); var ref = db.ref("/"); // Attach an asynchronous callback to read th
router
.route("/")
.get(function (req, res, err) {
// Get a database reference to our posts
var db = admin.database();
var ref = db.ref("/");
// Attach an asynchronous callback to read the data at our posts reference
ref.on("value", function (snapshot) {
var list = [];
snapshot.forEach(function (elem) {
list.push(elem.val());
})
res.send(list);
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
});
router
.route("/")
.post(function (req, res, err) {
console.log(req.body);
// Get a database reference to our posts
var db = admin.database();
var ref = db.ref("/");
// Attach an asynchronous callback to read the data at our posts reference
ref.push(
{
"text": req.body.text
}
);
});
当我运行我的应用程序时,我会获取所有数据,然后当我尝试将数据发布到数据库时,我会出现以下错误:
FIREBASE WARNING: Exception was thrown by user callback. Error: Can't set headers after they are sent.
当我使用一次而不是on
时,我不会得到错误,但由于我需要在数据库的每次更新中获取新数据,我应该使用on
来获取数据流
那么,如何在不出现此错误的情况下在
上使用 当您连接一个启用了的侦听器(“值”)
时,它将继续侦听数据。这意味着,如果数据稍后发生更改,它也会触发,此时您已经向客户端发送了一个响应并关闭了套接字
为了防止出现这种情况,您应该使用一次(“value”)
:
我还向错误处理程序添加了一个响应
更新
如果要继续向客户端发送更新,则需要保持连接打开。在这种情况下,不应调用res.send()
(关闭连接),而应调用res.write()
(保持连接打开)。看
当您连接一个启用了的侦听器(“值”)
时,它将继续侦听数据。这意味着,如果数据稍后发生更改,它也会触发,此时您已经向客户端发送了一个响应并关闭了套接字
为了防止出现这种情况,您应该使用一次(“value”)
:
我还向错误处理程序添加了一个响应
更新
如果要继续向客户端发送更新,则需要保持连接打开。在这种情况下,不应调用res.send()
(关闭连接),而应调用res.write()
(保持连接打开)。看
.on绑定一个不会消失的处理程序。一旦绑定了一个离开的处理程序。很明显,您希望后一种解决方案是行之有效的。一个请求不能多次响应,因此只听下一个更改是没有意义的。正如错误试图告诉您的那样,您只能发送一次响应。添加新数据时,once不会向前端发送更新您不能使用http请求执行更新。绑定一个不会消失的处理程序。一旦绑定了一个离开的处理程序。很明显,您希望后一种解决方案是行之有效的。一个请求不能多次响应,因此只听下一个更改是没有意义的。正如错误试图告诉您的那样,您只能发送一次响应。在添加新数据时,once不会向前端发送更新。您不能使用http请求执行此操作。正如我所说,这不会创建数据流。我的意思是,在前端,我有一个可观察的对象,它可以监听我的get http请求。我希望当我在数据库中发布一个数据时,我的可观察对象会自动更新视图。使用once不可能。在写入后调用send()
关闭连接。要保持连接打开,请使用write()
。但是一般来说,对于这种类型的方法,考虑使用Web套接字而不是纯HTTP。现在我用写<代码> FialBaseBebug得到这个错误:由用户回调引发异常。TypeError:第一个参数必须是字符串或缓冲区
,我想这意味着您只能编写res.write(JSON.stringify(list))
,正如我所说,这不会创建数据流。我的意思是,在前端,我有一个可观察的对象,它可以监听我的get http请求。我希望当我在数据库中发布一个数据时,我的可观察对象会自动更新视图。使用once不可能。在写入后调用send()
关闭连接。要保持连接打开,请使用write()
。但是一般来说,对于这种类型的方法,考虑使用Web套接字而不是纯HTTP。现在我用写<代码> FialBaseBebug得到这个错误:由用户回调引发异常。TypeError:第一个参数必须是字符串或缓冲区我猜这意味着只能写res.write(JSON.stringify(list))
router
.route("/")
.get(function (req, res, err) {
// Get a database reference to our posts
var db = admin.database();
var ref = db.ref("/");
// Attach an asynchronous callback to read the data at our posts reference
ref.once("value", function (snapshot) {
var list = [];
snapshot.forEach(function (elem) {
list.push(elem.val());
})
res.send(list);
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
res.status(500).send(errorObject.code);
});
});
router
.route("/")
.get(function (req, res, err) {
// Get a database reference to our posts
var db = admin.database();
var ref = db.ref("/");
// Attach an asynchronous callback to read the data at our posts reference
ref.on("value", function (snapshot) {
var list = [];
snapshot.forEach(function (elem) {
list.push(elem.val());
})
res.write(list);
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
res.status(500).send(errorObject.code);
});
});