我正在编写一些代理服务器代码,用于拦截请求(由用户点击浏览器窗口中的链接发起)并将请求转发给第三方文件服务器。然后我的代码获得响应并将其转发回浏览器。根据文件的mime类型,我想以两种方式之一处理文件服务器的响应:
我的节点堆栈包括Express + bodyParser,Request.js,EJS和Passport。这是基本的代理代码以及一些需要很多帮助的伪代码。 (Mia culpa!)
app.get('/file', ensureLoggedIn('/login'), function(req,res) {
var filePath = 'https://www.fileserver.com/file'+req.query.fileID,
companyID = etc…,
companyPW = etc…,
fileServerResponse = request.get(filePath).auth(companyID,companyPW,false);
if ( fileServerResponse.get('Content-type') == 'image/png') // I will also add other image types
// Line above yields TypeError: Object #<Request> has no method 'get'
// Is it because Express and Request.js aren't using compatible response object structures?
{
// render the image using an EJS template and insert image using base64-encoding
res.render( 'imageTemplate',
{ imageData: new Buffer(fileServerResponse.body).toString('base64') }
);
// During render, EJS will insert data in the imageTemplate HTML using something like:
// <img src='data:image/png;base64, <%= imageData %>' />
}
else // file is not an image, so let browser deal with receiving the data
{
fileServerResponse.pipe(res); // forward entire response transparently
// line above works perfectly and would be fine if I only wanted to provide downloads.
}
})
我无法控制文件服务器,文件不一定有文件后缀,这就是我需要获取MIME类型的原因。如果有更好的方法来执行此代理任务(例如暂时将文件服务器的响应存储为文件并进行检查)我很满意。此外,如果有帮助,我可以灵活地添加更多模块或中间件。谢谢!
答案 0 :(得分:2)
您需要根据其接口将回调传递给请求函数。它是异步的,不会将fileServerResponse作为返回值返回。
request.get({
uri: filePath,
'auth': {
'user': companyId,
'pass': companyPW,
'sendImmediately': false
}
}, function (error, fileServerResponse, body) {
//note that fileServerResponse uses the node core http.IncomingMessage API
//so the content type is in fileServerResponse.headers['content-type']
});
答案 1 :(得分:1)
您可以使用mmmagic模块。它是node.js的异步libmagic绑定,用于通过数据检查检测内容类型。