【问题标题】:Retrieving image data from gridFS storage从 gridFS 存储中检索图像数据
【发布时间】:2021-08-29 03:27:28
【问题描述】:

我正在尝试使用带有以下代码的快速路由器检索数据。 这个想法是将来自皮肤镜检查模型的 json 数据与最初使用 multer 和 gridfs 存储的图像数据相结合。 所以前端会接收到包含:标题、数据、文件名和图像数据的数据

不知何故,照片数据不包含图像数据。我该如何解决这个问题?

const router = require('express').Router();
let Dermoscopy = require('../models/photo_dermoscopy.model');
let PhotoFile = require('../models/photouploads.files.model');
let PhotoChunks = require('../models/photouploads.chunks.model');

router.route('/:id').get((req, res) => {
        Dermoscopy.find({ sessionId: { $eq: req.params.id }})
            .then(photo_dermoscopy => {
                const photodata = [];

                photo_dermoscopy.map(item => {
                    var imageData = PhotoFile.find({filename:item.filename})
                    .then(doc => {
                        PhotoChunks.find({files_id: doc[0]._id}).then(item => {
                            let fileData = [];
                            for (i=0; i< item.length; i++) {
                                fileData.push(item[i].data.toString('base64'));
                            }
                            let image = 'data: '+ doc[0].contentType + ';base64,' + fileData.join('');   
                            return image;
                        })
                        .catch(err => res.status(400).json('Error: ' + err));
                    })
                    .catch(err => res.status(400).json('Error: ' + err));  

                    photodata.push({caption: item.caption, date: item.datetaken, filename: item.filename, photo: imageData})
                })
                res.send(photodata)
                })
            .catch(err => res.status(400).json('Error: ' + err));
        });

【问题讨论】:

    标签: node.js express multer gridfs


    【解决方案1】:

    imageData可用时赋值含义:

    photodata.push({caption: item.caption, date: item.datetaken, filename: item.filename, photo: imageData})
    

    上面的代码在获取PhotoFile之前执行,它是undefined。您应该在PhotoFile 承诺中添加数据。

    
    const router = require('express').Router();
    let Dermoscopy = require('../models/photo_dermoscopy.model');
    let PhotoFile = require('../models/photouploads.files.model');
    let PhotoChunks = require('../models/photouploads.chunks.model');
    
    router.route('/:id').get((req, res) => {
            Dermoscopy.find({ sessionId: { $eq: req.params.id }})
                .then(photo_dermoscopy => {
                    const photodata = [];
    
                    photo_dermoscopy.map(item => {
                        var imageData = PhotoFile.find({filename:item.filename})
                        .then(doc => {
                            PhotoChunks.find({files_id: doc[0]._id}).then(item => {
                                let fileData = [];
                                for (i=0; i< item.length; i++) {
                                    fileData.push(item[i].data.toString('base64'));
                                }
                                let image = 'data: '+ doc[0].contentType + ';base64,' + fileData.join('');   
                                 photodata.push({caption: item.caption, date: item.datetaken, filename: item.filename, photo: imageData})
                                return image;
                            })
                            .catch(err => res.status(400).json('Error: ' + err));
                        })
                        .catch(err => res.status(400).json('Error: ' + err));  
    
                        
                    })
                    res.send(photodata)
                    })
                .catch(err => res.status(400).json('Error: ' + err));
    
    

    您也可以使用async/await,它提供了更好的可读性。

    const router = require('express').Router();
    let Dermoscopy = require('../models/photo_dermoscopy.model');
    let PhotoFile = require('../models/photouploads.files.model');
    let PhotoChunks = require('../models/photouploads.chunks.model');
    
    router.route('/:id').get(async (req, res) => {
           try {  
            const photo_dermoscopy = await Dermoscopy.find({ sessionId: { $eq: req.params.id }})
            const photodata = [];
            photo_dermoscopy.map(item => {
                
                const imageData = await PhotoFile.find({filename:item.filename})        
                const item = await PhotoChunks.find({files_id: doc[0]._id})
                let fileData = [];
                
                for (i=0; i< item.length; i++) {
                    fileData.push(item[i].data.toString('base64'));
                }
               
                let image = 'data: '+ doc[0].contentType + ';base64,' + fileData.join('');   
                photodata.push({caption: item.caption, date: item.datetaken, filename: item.filename, photo: imageData})
                return image;
                });
                res.send(photodata);
            } catch (error) {
                console.log(error);
            }
    })
                   
    

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 2011-12-10
      • 2014-04-20
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2011-03-21
      • 2012-02-06
      相关资源
      最近更新 更多