Express JS渲染视图与收到的图像

时间:2018-05-20 13:01:55

标签: javascript html api express httprequest

我正在处理两个Express JS个应用程序,一个是API,第二个是使用此API的应用程序,通过向用户发出请求并显示收到的信息。

API路线中,我将图片作为回复发送:

router.get('/:customer_id',authController.isAuthenticated,(req,res) => {
    .
    . Retrieving customer data
    .

    return res.sendFile('/uploads/'+foundCustomer.doc_path);
});

后来另一个应用程序正在获取此document

router.get('/:customer_id',(req,res) => {
    var options = {
    url: 'http://'+config.API.user+':'+config.API.password+'@'+config.API.host+':'+config.API.port+'/customers/'+req.params.customer_id
    };

    request(options,(err,response,body)=>{
        return res.render('customer/show',{
            document: ?, // Send document as parameter to view
        });
    });
});

此时我想用客户customer/show呈现document(EJS视图引擎),但我不想将此文档保存在我的应用程序文件中,因为document是只需要在视图中显示(客户详细信息和文档存储在另一个应用程序中)。

我试图在我的应用程序结构中创建temporary目录,但很难管理删除那些不需要的文档(应用程序有很多users,同时很多customers可以显示)。

我尝试实现的另一个解决方案是在客户端发出Ajax请求,然后将收到的文档附加到<object data='document'>。但是这个请求必须通过userpassword进行身份验证,所以我意识到在客户端javascript上存储凭据不是最好的想法......

我不确定render是否可以在不保存应用程序文件的情况下显示图像?

我将不胜感激任何帮助,也许最好的解决方法是以某种方式管理temporarily已保存的文档。

3 个答案:

答案 0 :(得分:0)

为什么不在EJS模板中创建一个File对象,然后将其用于src的{​​{1}}属性?您已从图像API服务器获取原始缓冲区/ blob。将其存储在模板中。

答案 1 :(得分:0)

来自https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob

// place this code (store this variable) inside of your EJS template
// so it can be used by the client-side JS
var aBlob = new Blob( array[, options]); // Where array is the raw buffer data returned from your image API server

请参阅https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL

var objectURL = URL.createObjectURL( aBlob ); // Where object is a Blob object

请参阅https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject

const img = document.createElement('img');
img.src = objectURL;

答案 2 :(得分:0)

最终解决方案(已测试),使用axios发出API请求:

在我的路线中,我将向API发送HTTP请求以检索PDF文件(文档):

axios.get(`http://my-api/customer/id`).then(response => {
   var photo =  new Buffer(response.data, 'binary').toString('base64');

   return res.render('customers/show',{
       document: document
   });
});

在我的ejs视图中,我使用HTML object标记来显示收到的PDF:

<object data="data:application/pdf;base64,<%-document%>"></object>