0

我正在尝试使用以下代码使用快速路由器检索数据。这个想法是将来自皮肤镜检查模型的 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));
        });
4

1 回答 1

0

分配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);
        }
})
               
于 2021-06-12T14:24:47.180 回答