在REST API中处理本机对象

我有一个使用expressjs实现的web服务器api,它提供REST api来logging连接到Web服务器机器的networking摄像机。

networking摄像机和编码是使用C ++编写的dll处理的,互操作是使用node-ffi库完成的。

我遇到的问题是我在我的响应中混合使用JSONstring的原生ffi句柄。

例如我有一个Stream类与原型:

 Stream.prototype.id = ''; Stream.prototype.url = '': Stream.prototype.parent = null; Stream.prototype.filePtr = null; 

Stream.filePtr将包含一个ffi句柄,例如ref.refType(ref.types.void)

然后在我的expressjs POST start呼叫我做类似的事情:

 impl.start = function(req, res){ var camera = cameras.find(function(camera) { return camera.id === req.params.camera; }); res.send(camera.startStream()); // startStream returns a new 'Stream' object. }; 

正如你所看到的,我只是简单地将Stream对象发送给响应。 我通常如何实现REST API。 问题是,本地filePtr句柄不应该真的被包括在内,我不确定什么是最好的做法,或者如果我做了根本性的错误?

注:我是一个新手,当谈到networking,nodejs,expressjs和一般的JavaScript。 所以如果我正在做的事情没有意义,或者可以做得更好,请指出。

一个更完整的例子:

 // dll bindings var fileType = ref.types.void; var filePtrType = ref.refType(fileType); var cameraType = ref.types.void; var cameraPtrType = ref.refType(cameraType); var myLib = ffi.Library(/* Stuff */): // expressjs api definitions app.post('api/cameras/:camera/streams', impl.start); app.delete('api/cameras/:camera/streams/:stream', impl.stop); app.get('api/cameras', impl.cameras); app.get('api/cameras/:camera', impl.camera); app.get('api/cameras/:camera/streams', impl.streams); app.get('api/cameras/:camera/streams/:stream', impl.stream); // objects definitions function Stream() { this.id = Date.now(); this.url = this.id + '.mp4'; }; Stream.prototype.id = ''; Stream.prototype.url = '': Stream.prototype.parent = null; Stream.prototype.filePtr = null; function Camera(id, device){ this.id = id; this.device = device; this.cameraPtr = myLib.openCamera(device); }; Camera.prototype.id = ''; Camera.prototype.device = 0; Camera.prototype.cameraPtr = null; Camera.prototype.startStream = function() { var stream = new Stream(this); stream.filePtr = myLib.openFile(this.cameraPtr, stream.url); return stream; }; Camera.prototype.stopStream = function(stream) { myLib.closeFile(stream.filePtr); this.streams.slice(this.streams.indexOf(stream), 1); }; // object declaration var cameras = []; var numCameras = myLib.num_cameras(); for (var n = 0; n < numCameras; ++n) { cameras.push(new Camera(n, n)); } // express api implementation var impl = {}; impl.streams = function(req, res) { var camera = cameras.find(function(camera) { return camera.id === req.params.camera; }); res.send(camera.streams); }; impl.start = function(req, res){ var camera = cameras.find(function(camera) { return camera.id === req.params.camera; }); res.send(camera.startStream()); }; impl.stop = function(req. res) { var camera = cameras.find(function(camera){ return camera.id === req.params.camera; }); var stream = camera.streams.find(function(stream) { return stream.id === req.params.stream: }); camera.stopStream(stream); }; /* Stuff */ 

我相信你想pipestream数据的响应,而不是直接返回stream。 尝试这个。 这里是关于pipe道的文档 。

 var readableStream = camera.startStream(); readableStream.pipe(res); 

编辑

那么,实际上,只要数据用完(因为是stream式传输),您可能不想结束writableStream(响应是一个writableStream),所以如果以上操作不起作用,请尝试以下操作:

  var readableStream = camera.startStream(); readableStream.on('data', function(chunk) { res.write(chunk); }) 

其他想法

如果你想一次返回多个数据stream,你可能需要为每个请求分别创build一个http请求。 一次返回多个数据stream(除非你做了非常聪明的事情)可能只是发回一堆混杂的数据。

尝试回答实际的问题

当客户端请求stream时,显然你不能以JSON的forms返回原始数据,因为JSON不允许这样做。 当客户端请求stream资源返回客户端应该请求的资源位置(URL)时,我会build议。 我相信这是正确的REST方式,但我不是专家。 这就是交互的方式:

客户:(通过GET)请给我stream

服务器:响应(JSON)这里是你需要去获得(加元数据[可选])

客户端:请给我jsonResponse.streamURL

服务器:(stream应答)….