Как сохранить массив файлов в базе данных mongoDB, используя multer? - PullRequest
0 голосов
/ 11 мая 2019

Я создаю конечную точку, используя nodejs, которая будет хранить массив изображений, используя multer.Это позволяет мне сохранить одно изображение, но я не знаю, как поступить с несколькими изображениями.Для загрузки одного изображения это код, который я написал:

router.post ('/upload',auth, upload.single('upload'), async (req:Request, res:Response) =>{
    const bufferData = {
        image:req.file.buffer
    };

    const image = new Image(bufferData);    
    image.save();
    res.send()
},(error:Error, req:Request, res:Response, next:NextFunction)=>{    
    res.status(400).send({error:error.message})
})

Для загрузки одного файла это работает нормально.Для загрузки нескольких файлов я пытаюсь этот код.

router.post ('/upload',auth, upload.array('upload'), async (req:Request, res:Response) =>{
    const bufferData = {
        images:req.files         // no here option for req.files.buffer
    };

        const image = new Image(bufferData);    
        image.save();
        res.send()
    },(error:Error, req:Request, res:Response, next:NextFunction)=>{    
        res.status(400).send({error:error.message})
    })

Тип данных для хранения изображения должен быть буфер.Но нет никакой возможности получить массив изображений в буферном формате, например req.file.buffer.Как можно эти данные в формате массива?

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Не видя вашего полного кода, я предполагаю, что ваш Image класс - это класс, расширяющий mongoose, который имеет какой-то метод сохранения?

Если это так, ваш save() метод, вероятно, асинхронный. Это означает, что вам нужно дождаться разрешения метода, прежде чем продолжить / вернуться.

router.post ('/upload',auth, upload.array('upload'), async (req:Request, res:Response) => {
    const promises = req.files.map(file => {
        const image = new Image(file.buffer) // create the new Image
        return image.save // return the promise without calling it yet
    })

    const images = await Promise.all(promises) // calls all the porimises returned in `promises`

    // we let the Promise.all resolve before calling res.send()

    res.send(images) 
},(error:Error, req:Request, res:Response, next:NextFunction)=>{    
    res.status(400).send({error:error.message})
})

Как вы можете видеть здесь, мы создаем массив обещаний с именем promises.

Затем мы вызываем все это с помощью Promise.all(promises), и как только они будут разрешены, мы можем затем вернуться с помощью нашего res.send метода

Я не тестировал этот код, и мне пришлось немного догадаться, как выглядит остальная часть вашей базы кода, так что, надеюсь, это сработает.

0 голосов
/ 12 мая 2019

Найден один трюк, чтобы сделать это.

const files = req.files;
const images = map(files, (file:any)=>{
    const bufferData = (file as Express.Multer.File).buffer;
    return bufferData;
})

Это 'images' теперь является массивом типа Buffer, который вы можете сохранить в базе данных mongoDB в виде двоичных файлов.

...