Javascript Nodejs流(错误:发送头后不能设置头)
我正试图从braintree服务器构建一个api。参考本文件 要从服务器访问所有事务,我必须返回一个节点流 前 我知道流以块的形式返回数据,因此上面的Javascript Nodejs流(错误:发送头后不能设置头),javascript,node.js,stream,Javascript,Node.js,Stream,我正试图从braintree服务器构建一个api。参考本文件 要从服务器访问所有事务,我必须返回一个节点流 前 我知道流以块的形式返回数据,因此上面的res.json()很可能被多次调用,导致错误:发送后无法设置头文件 所以我的问题是,我如何将数据一块发送到客户机?nodejs流让我感到困惑,我将阅读更多关于它的内容,但是如果能够理解如何在不重新发送头的情况下将数据发送到客户端,那就太好了。除非您正在读取的流处于对象模式,否则您不应该对数据事件做出任何假设。您可以得到一个数据事件或一百个(当然取
res.json()
很可能被多次调用,导致错误:发送后无法设置头文件
所以我的问题是,我如何将数据一块发送到客户机?nodejs流让我感到困惑,我将阅读更多关于它的内容,但是如果能够理解如何在不重新发送头的情况下将数据发送到客户端,那就太好了。除非您正在读取的流处于对象模式,否则您不应该对
数据
事件做出任何假设。您可以得到一个数据
事件或一百个(当然取决于输入大小),因为TCP是一个流
您可能想要的是这样的内容(假设stream
未处于对象模式):
或者只是通过管道将流传输到响应:
app.get('/project', function(req, res) {
if(req.user) {
var stream = gateway.transaction.search(function (search) {
search.customerId().is(req.user.id);
});
stream.on("ready", function () {
console.log(stream.searchResponse);
});
res.setHeader('Content-Type', 'application/json');
stream.pipe(res);
}
});
对于对象流,您可以执行以下操作:
app.get('/project', function(req, res) {
if(req.user) {
var stream = gateway.transaction.search(function (search) {
search.customerId().is(req.user.id);
});
stream.on("ready", function () {
console.log(stream.searchResponse);
});
var result = [];
stream.on("data", function (data) {
result.push(data);
});
stream.on("end", function() {
res.json(result);
});
}
});
除非从中读取的流处于对象模式,否则不应对
数据
事件进行任何假设。您可以得到一个数据
事件或一百个(当然取决于输入大小),因为TCP是一个流
您可能想要的是这样的内容(假设stream
未处于对象模式):
或者只是通过管道将流传输到响应:
app.get('/project', function(req, res) {
if(req.user) {
var stream = gateway.transaction.search(function (search) {
search.customerId().is(req.user.id);
});
stream.on("ready", function () {
console.log(stream.searchResponse);
});
res.setHeader('Content-Type', 'application/json');
stream.pipe(res);
}
});
对于对象流,您可以执行以下操作:
app.get('/project', function(req, res) {
if(req.user) {
var stream = gateway.transaction.search(function (search) {
search.customerId().is(req.user.id);
});
stream.on("ready", function () {
console.log(stream.searchResponse);
});
var result = [];
stream.on("data", function (data) {
result.push(data);
});
stream.on("end", function() {
res.json(result);
});
}
});
res.json()
用于作为单个响应,并结束响应。不能对同一请求/响应多次调用它。它通常也不能用于任意数据块,因为它需要一段完整的javascript数据才能呈现合法的JSON。是的,我在一定程度上理解了这一点,但我的问题是如何在('data')回调中获取该数据,并将该数据发送到客户端。也许我应该提高我的普通javascript技能,用回调或其他方法构建一个函数,然后在流.on('end')
回调中使用res.json()?我不知道你到底想完成什么。我的应用程序有一个部分,客户可以在其中查看他们的交易,因此我正在构建一个模型,或者在客户端javascript上创建一个集合。所以我需要发出一个ajax请求,因此需要json。因此,为了回答您的问题,我怀疑如果数据是流式的,客户端获取方法是否会工作得很好?我希望braintree不会将其变成流,如果数据是大的,我会得到它,但他们在这里有一个完美的方法gateway.transaction.find(“TransactionId”,function(err,transaction){)
但我不能使用需要按customerId搜索的TransactionIDres。json()
将用作单个响应,并结束响应。不能对同一请求/响应多次调用它。它通常也不能用于任意数据块,因为它需要一段完整的javascript数据才能呈现合法的JSON。是的,我在一定程度上理解了这一点,但我的问题是如何在('data')
回调中获取该数据,并将该数据发送到客户端。也许我应该提高我的普通javascript技能,用回调或其他方法构建一个函数,然后在流.on('end')
回调中使用res.json()?我不知道你到底想完成什么。我的应用程序有一个部分,客户可以在其中查看他们的交易,因此我正在构建一个模型,或者在客户端javascript上创建一个集合。所以我需要发出一个ajax请求,因此需要json。因此,为了回答您的问题,我怀疑如果数据是流式的,客户端获取方法是否会工作得很好?我希望braintree不会将其变成流,如果数据是大的,我会得到它,但他们在这里有一个完美的方法gateway.transaction.find(“TransactionId”,function(err,transaction){)代码>但我不能使用TransactionID,我需要按customerIdGreat搜索,我一直看到管道,但这确实有助于将其放到上下文中。这是有道理的,让我试试。第一种方法似乎有效,第二种方法我出错了。我确实喜欢第一种方法,但我得到了[object object][object]
,因此很明显,braintree服务器上有两个对象(事务)。那么,我如何将它们作为对象数组返回,而不是[object object][object]
这是一个很难回答的问题,但我的普通javascript可能需要一些工作。我复制了这里发生的事情,我认为这与正在发生的事情非常相似。我可能需要专门为此提出一个新问题,但我想知道为什么我会得到[object object]
。我至少可以搞乱fiddle,而且我不必担心一遍又一遍地重新启动服务器并重新登录,所以这很好。好吧,看起来它是一个对象流。我已经更新了我的答案。啊,好吧,哇,我没想到要使用推送
。谢谢你帮了大忙。很棒的东西,我一直在看管道,但这确实有助于把它放在上下文中。这是有道理的,让我试试。第一种方法似乎有效,第二种方法我出错了。我确实喜欢第一种方法,但我得到了[object object][object]
,因此很明显,braintree服务器上有两个对象(事务)。那么,我如何将它们作为对象数组返回,而不是[object object][object]
这是一个很难回答的问题,但是我的普通javascript需要一些工作