Opeyemi Odedeyi
Opeyemi Odedeyi

Reputation: 770

ran into an error trying to upload multiple images to AWS using Node js

I am trying to upload multiple images to when a user creates a center which is a model, and because I want to have control over the images it has its own model called media.

//  Create an event center
router.post('/api/center', isVerified, upload.array('images', 15), async (req, res) => {
    const files = req.files.buffer
    const center = new Center({
        ...req.body,
        owner: req.user._id,
        isOpen: true,
    })
    console.log("initialized center")

    try {
        files.forEach(async (file) => {
            const buffer = await sharp(file)
                                .jpeg({
                                    quality: 100,
                                    chromaSubsampling: '4:4:4',
                                    force: true
                                })
                                .toBuffer()
        
            const params = {
                Bucket: process.env.AWS_BUCKET_NAME,
                Key: `${uuidv4()}.jpeg`,
                Body: buffer
            }

            console.log("about to upload to s3")
    
            const data = await s3.upload(params).promise()

            const med = new Media({
                url: data.Location,
                owner: req.user._id
            })

            await med.save()
            console.log(`${med.url} saved`); //added check to see if photo uploaded

            center.media.addToSet(med.id)
        })

        console.log("upload completed")
        await center.save()
        console.log("saved")
        res.status(201).send(center)
    } catch (e) {
        console.log("failed", e);
        res.status(500).send(e)
    }
})

when I try to create a center and including images, I run into an error

Server is up on port 3000
initialized center
failed TypeError: Cannot read property 'forEach' of undefined
    at D:\odede\Documents\Nodejs\eventCenter\src\routers\center.js:24:26
    at Layer.handle [as handle_request] (D:\odede\Documents\Nodejs\eventCenter\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\odede\Documents\Nodejs\eventCenter\node_modules\express\lib\router\route.js:137:13)
    at Array.<anonymous> (D:\odede\Documents\Nodejs\eventCenter\node_modules\multer\lib\make-middleware.js:53:37)
    at listener (D:\odede\Documents\Nodejs\eventCenter\node_modules\on-finished\index.js:169:15)
    at onFinish (D:\odede\Documents\Nodejs\eventCenter\node_modules\on-finished\index.js:100:5)
    at callback (D:\odede\Documents\Nodejs\eventCenter\node_modules\ee-first\index.js:55:10)
    at IncomingMessage.onevent (D:\odede\Documents\Nodejs\eventCenter\node_modules\ee-first\index.js:93:5)
    at IncomingMessage.emit (events.js:314:20)
    at IncomingMessage.EventEmitter.emit (domain.js:486:12)
    at endReadableNT (_stream_readable.js:1244:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)

please what could be wrong, or what could I be missing?

Upvotes: 0

Views: 32

Answers (1)

cbr
cbr

Reputation: 13662

Since you're passing file directly to sharp, you probably meant to map files to the buffers:

const files = req.files.map(file => file.buffer)

Upvotes: 1

Related Questions