在代理中获取节点Request.js响应的MIME类型 - 显示图像

时间:2013-10-30 03:37:34

标签: node.js express proxy request

我正在编写一些代理服务器代码,用于拦截请求(由用户点击浏览器窗口中的链接发起)并将请求转发给第三方文件服务器。然后我的代码获得响应并将其转发回浏览器。根据文件的mime类型,我想以两种方式之一处理文件服务器的响应:

  1. 如果文件是图像,我想将用户发送到新页面 显示图像,或
  2. 对于所有其他文件类型,我只是希望浏览器处理它(通常是下载)。
  3. 我的节点堆栈包括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类型的原因。如果有更好的方法来执行此代理任务(例如暂时将文件服务器的响应存储为文件并进行检查)我很满意。此外,如果有帮助,我可以灵活地添加更多模块或中间件。谢谢!

2 个答案:

答案 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绑定,用于通过数据检查检测内容类型。