我正在玩弄所有花哨的node.js / mongodb / express平台,偶然发现一个问题:
app.get('/tag/:tag', function(req, res){
var tag=req.params.tag;
console.log('got tag ' + tag + '.');
catalog.byTag(tag,function(err,cursor) {
if(err) {
console.dir(err);
res.end(err);
} else {
res.writeHead(200, { 'Content-Type': 'application/json'});
//this crashes
cursor.stream().pipe(res);
}
});
});
您可能已经猜到了,对Mongodb catalog.byTag(tag, callback)
进行find()
查询并返回游标
这会导致错误:
TypeError: first argument must be a string or Buffer
根据mongodb驱动程序doc,我试图将此转换器传递给stream()
:
function(obj) {return JSON.stringify(obj);}
但这无济于事。
谁能告诉我如何正确地将某些内容发送给响应?
还是唯一的解决方案是使用’data’和’end’事件手动抽取数据的样板?
这里的其他答案的工作组合
app.get('/comments', (req, res) => {
Comment.find()
.cursor()
.pipe(JSONStream.stringify())
.pipe(res.type('json'))
})
http://mongoosejs.com/docs/api.html#query_Query-
cursor
cursor()
返回与Node stream3兼容的流,并且该流优先于不推荐使用的query.stream()
接口。JSONStream.stringify()
将文档组合成数组而不是单个对象res.type('json')
将HTTP Content-Type
标头设置为的管道application/json
并再次返回自身(响应流)。问题内容: 我有一种情况,我需要从Node.js / Express RESTful API返回一个很大的对象,并将其转换为JSON字符串。 但是,这似乎无法很好地扩展。具体来说,它在连接1-2个客户端的测试机上运行良好,但我怀疑当许多客户端同时请求大型JSON对象时,此操作可能会浪费CPU和内存使用率。 我四处寻找一个异步JSON库,但是我发现的唯一一个库似乎有问题(特别是,我收到了[Range
问题内容: 我一直在使用Node.js中的二进制流进行实验,但令我惊讶的是,确实有一个工作演示,它使用节点无线电流获取Shoutcast流,并使用分块编码将其推入HTML5元素。但这仅适用于Safari! 这是我的服务器代码: 我的客户代码很简单: 这在Mac上的Safari 5中可以正常运行,但在Chrome或Firefox中似乎无法执行任何操作。有任何想法吗? 可能的候选对象包括编码问题,或者
我正在尝试编写同时使用gRPC和REST的服务。实现技术有Java、Spring-Boot和gRPC。使用场景示例如下: 目的是有外部客户端可以通过RESTendpoint和/或通过进行gRPC调用与应用程序交互。在内部,有“网关”服务提供外部接口,并负责在外部客户端和执行实际工作的“域”服务之间传输/路由请求和响应。内部服务将通过gRPC进行通信。 外部客户端不知道如何在内部处理事情,域服务没有
问题内容: 我产生了以下孩子:我希望在客户端( 浏览器 )上 一个接一个地 而不是整体接收ping结果。 到目前为止,我已经尝试过了: 然后: 在这两种情况下,浏览器都将等待10次ping操作,然后将结果整体打印出来。我想让他们一个接一个,如何实现呢? (客户只是在拨打电话并用console.log记录结果) 编辑: 尽管我确实相信websockets是实现这一点所必需的,但我只是想知道是否还有其
问题内容: 我需要连续运行两个命令,这些命令需要从同一流中读取数据。将流传输到另一个流之后,缓冲区将被清空,因此我无法再次从该流读取数据,因此无法正常工作: 要求 对此抱怨 和改变 的inputStream 到收益率,当然同样的问题。我不想写入文件,而是以某种方式 重用 请求 产生的流(或与此相关的任何其他流)。 一旦可读流完成管道传输,是否可以重用?完成上述示例的最佳方法是什么? 问题答案: 您
问题内容: 我在Node.js中使用流服务器来流MP3文件。虽然可以流式传输整个文件,但我不能使用标题将文件流式传输到起始位置并使用终止位置。 我使用like 从秒计算开始和结束字节 在这种情况下,这将为我提供从10秒到下一个第一个数据包的确切字节。 这在Node.js中变得如此简单 现在我有了开始和结束字节,我的媒体服务器将以这种方式从传递给它的自定义值中获取范围 此时,我将获得这个范围, 因此