Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在RESTAPI中处理本机对象_Javascript_Node.js_Express_Node Ffi - Fatal编程技术网

Javascript 在RESTAPI中处理本机对象

Javascript 在RESTAPI中处理本机对象,javascript,node.js,express,node-ffi,Javascript,Node.js,Express,Node Ffi,我使用expressjs实现了一个web服务器api,它提供了用于记录连接到web服务器机器的web摄像机的静态api 使用C++编写的DLL处理网络摄像机和编码,使用库进行互操作。 我遇到的问题是,我在回复中混合了本地ffi句柄和JSON字符串化 e、 g.我有一个带有原型的流类: Stream.prototype.id = ''; Stream.prototype.url = '': Stream.prototype.parent = null; Stream.prototype.fileP

我使用expressjs实现了一个web服务器api,它提供了用于记录连接到web服务器机器的web摄像机的静态api

使用C++编写的DLL处理网络摄像机和编码,使用库进行互操作。 我遇到的问题是,我在回复中混合了本地ffi句柄和JSON字符串化

e、 g.我有一个带有原型的
类:

Stream.prototype.id = '';
Stream.prototype.url = '':
Stream.prototype.parent = null;
Stream.prototype.filePtr = null;
其中
Stream.filePtr
将包含ffi句柄,例如
ref.refType(ref.types.void)

然后在我的expressjs帖子
start
call中,我做了如下操作:

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.
};
如您所见,我只是将
对象原样发送到响应。这就是我通常实现RESTAPI的方式。问题是本机
filePtr
句柄实际上不应该包括在内,我不确定这方面的最佳实践是什么,或者我是否做了一些根本错误的事情

注意:对于web、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 */
//dll绑定
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*/):
//expressjsapi定义
app.post('api/cameras/:camera/streams',impl.start);
应用程序删除(“api/cameras/:camera/streams/:stream”,impl.stop);
应用程序get(“api/摄像机”,嵌入式摄像机);
app.get('api/cameras/:camera',impl.camera);
app.get('api/cameras/:camera/streams',impl.streams);
app.get('api/cameras/:camera/streams/:stream',impl.stream);
//对象定义
函数流(){
this.id=Date.now();
this.url=this.id+'.mp4';
};
Stream.prototype.id='';
Stream.prototype.url='':
Stream.prototype.parent=null;
Stream.prototype.filePtr=null;
功能摄像机(id、设备){
this.id=id;
这个装置=装置;
this.cameraPtr=myLib.openCamera(设备);
};
Camera.prototype.id='';
Camera.prototype.device=0;
Camera.prototype.cameraPtr=null;
Camera.prototype.startStream=函数(){
变量流=新流(本);
stream.filePtr=myLib.openFile(this.cameraPtr,stream.url);
回流;
};
Camera.prototype.stopStream=函数(流){
myLib.closeFile(stream.filePtr);
this.streams.slice(this.streams.indexOf(stream),1);
};
//对象声明
var摄像机=[];
var numCameras=myLib.num_cameras();
对于(变量n=0;n
我相信您希望通过管道将流数据传输到响应,而不是直接返回流。试试这个。这是关于管道的最新消息

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

事实上,您可能不想在数据用完后立即结束writableStream(响应是writableStream)(因为您正在进行流式处理),因此如果上述操作不起作用,请尝试以下操作:

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

如果希望一次返回多个流,则可能需要为每个流分别发出http请求。一次返回多个流(除非您做了一些非常聪明的事情)可能只会返回一堆混乱的数据

尝试回答实际问题

当客户端请求流时,显然不能将原始数据作为JSON返回,因为JSON不允许这样做。我建议当客户端请求流资源时,返回客户端应该请求的资源位置(URL)。我相信这是正确的休息方式,但我不是这方面的专家。这就是互动的方式:

客户:(via GET)请给我流

Server:response(json)这里是您需要去获取它的地方(加上元数据[可选])

客户:请给我jsonResponse.streamURL


服务器:(从流到响应)…

好主意,我试试看。但是,它并没有回答我的问题:)。我已经在dll中创建了http流。我遇到的问题是构建RESTAPI来控制流;我假设将数据写入响应将处理您的问题,因为
文件ptr
不会公开。今天早上大脑还不太正常。