Mis*_*olf 4 encoding http node.js meteor
所以,我试图弄清楚如何下载远程图像,然后使用CollectionFS存储下载的图像.
我试图在CFS中使用自动URL处理,但是我正在下载图像-from-的主机已禁用HEAD请求,因此我无法使用它.
我要么使用Meteor.get,要么使用NPM的'请求',但我真的不明白如何将两者合并以获得所需的结果.
任何想法将不胜感激.我所知道的只是在Meteor.get请求中使用URL,但在那之后,我真的迷路了.
这是我到目前为止所得到的,但我不知道如何处理请求的结果:
var result = HTTP.get(url);
Run Code Online (Sandbox Code Playgroud)
我只假设我应该对result.body做一些事情(根据Meteor文档),但我不知道如何正确编码该对象,以便可以将其推送到本地的CFS集合中.
从我在CollectionFS API上看到的内容,服务器端插入可以将Node.js Buffer
对象作为参数.
https://github.com/CollectionFS/Meteor-CollectionFS#getting-started
Buffer
你可以从npm request
包中获得一个对象,encoding
设置为null
,这就是你期望插入到CollectionFS中的对象.
如果我们不设置encoding
到null
,响应将经过编码的字符串,这将打破我们的图像数据,因为这是原始的二进制.
不幸的是你不能使用Meteor HTTP包来执行此操作,因为它充当npm的包装器request
并且特别强制编码为utf-8,如第74行所示:
https://github.com/meteor/meteor/blob/devel/packages/http/httpcall_server.js#L74
您可能知道,npm软件包不能直接在Meteor中使用,因为服务器端环境依赖于Fiber
s.
所以这是一个必要的包装请求,作为一个尚未发布的包:
/packages/request/package.js :
Package.describe({
summary:"Simplified HTTP request client",
version:"2.40.0"
});
Npm.depends({
"fibers":"1.0.1",
"request":"2.40.0"
});
Package.onUse(function(api){
//
api.versionsFrom("METEOR@0.9.0.1");
//
api.use("underscore","server");
//
api.addFiles("server/lib/request.js","server");
//
api.export("request","server");
});
Run Code Online (Sandbox Code Playgroud)
/packages/request/server/lib/request.js
:
var Future=Npm.require("fibers/future");
request=Npm.require("request");
var requestSync=function(uri,options){
var future=new Future();
request(uri,options,function(error,response,body){
if(error){
console.log(error);
throw error;
}
future.return({
response:response,
body:body
});
});
return future.wait();
};
_.extend(request,{
putSync:function(uri,options){
options.method="PUT";
return requestSync(uri,options);
},
patchSync:function(uri,options){
options.method="PATCH";
return requestSync(uri,options);
},
postSync:function(uri,options){
options.method="POST";
return requestSync(uri,options);
},
headSync:function(uri,options){
options.method="HEAD";
return requestSync(uri,options);
},
delSync:function(uri,options){
options.method="DELETE";
return requestSync(uri,options);
},
getSync:requestSync
});
Run Code Online (Sandbox Code Playgroud)
然后你可以使用这样的请求:
var result=request.getSync(url,{
encoding:null
});
var buffer=result.body;
Run Code Online (Sandbox Code Playgroud)
该buffer
变量将保存您需要传递给CollectionFS插入的未更改的图像数据.