Узел JS Медленная загрузка с Multer - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над проектом с экземпляром (моим тестовым сервером) с Docker.

У меня на самом деле есть клиент (приложение для загрузки) и API с Node JS, хранилищем для нескольких устройств и Google Cloud Storage.

Моя база данных представляет собой набор реплик из 3 контейнеров MongoDB (1 основной и 2 вторичный).

Проблема во время загрузки, процесс очень длинный (POST 17сек).

Моя стратегия заключается в том, чтобы хранить информацию о файле (png, pdf, jpeg ...) в моей базе данных mongoDB и сохранять файл в файловой системе, смонтированной в моем контейнере api. Если файл является изображением, мы изменяем его размер в виде большого письма и сохраняем его в файловой системе, обновляем путь к документу в mongodb, загружаем в Google Cloud Storage файл (оригинальный размер) и удаляем его в локальный файл.

Но весь этот процесс с моим кодом очень длинный.

// Enable Storage
const gcs = gcloud.storage({
    projectId: 'myprojectid',
    keyFilename: 'mykeyfilename',
});

// environments Variables
let clientUrl;
let smtpTransport;
let bucket;


 bucket = gcs.bucket('mybucket');

 module.exports = {

    async create(req, res) {
        const upload = multer({
            storage: multer.diskStorage({
                destination: (req, file, callback) => {
                    const client = JSON.parse(req.body.client);
                    const companyName = client.company_name;
                    const type = file.mimetype.split('/')[1];
                    const path = `./uploads/${companyName}/${type}`;
                    fs.mkdirsSync(path);
                    callback(null, path);
                },
                filename: (req, file, callback) => {
                    // originalname is the uploaded file's name with extn
                    callback(null, `${Date.now()}_${file.originalname}`);
                },
            }),
            limits: {
                fileSize: 500000000, // 500mb max
            },
        }).array('document');

        try {
            await upload(req, res, async () => {
                let addedBy;
                const docs = [];

                const userTypeJwt = extractTypeUserJwt(req);

                if (userTypeJwt === 'admins') {
                    addedBy = 'admin';
                } else {
                    addedBy = 'client';
                }

                const client = JSON.parse(req.body.client);

                req.files.forEach(async (file) => {
                    try {
                        const doc = await Document.create({
                            filename: file.originalname,
                            client: {
                                client_id: client._id,
                                company_name: client.company_name,
                                firstname: client.firstname,
                                lastname: client.lastname,
                                email: client.email,
                            },
                            added_by: addedBy,
                            mimetype: file.mimetype,
                            path: file.path,
                            size: file.size,
                        });
                        docs.push(doc);

                        /**
                         * Resizing de l'image originel
                         *
                         * Puis update path du document dans la base de donnée
                         */
                        const resizedPath = await imgProc(file, client.company_name);
                        await doc.update({
                            path: resizedPath,
                        });

                        /**
                         * Vérification image ?
                         *
                         * Si oui, upload de l'image originel sur le google cloud storage
                         *
                         * Suppression du fichier origine sur le local
                         */
                        if (file.mimetype.split('/')[0] === 'image') {
                            await bucket.upload(file.path);
                            console.log('File uploaded to Google cloud Storage');
                            await fs.unlink(file.path);
                            console.log('File deleted from local');
                        }
                    } catch (err) {
                        console.log(err);
                    }
                });

                if (addedBy === 'client') {
                    const mailOptions = {
                        to: config.contact_email,
                        from: config.contact_email,
                        subject: `${client.company_name} a uploadé dans son Espace`,
                        template: 'client_upload',
                        context: {
                            company_name: client.company_name,
                            docs,
                        },
                    };

                    try {
                        await smtpTransport.use('compile', mailerhbs({
                            viewPath: 'templates/emails',
                            extName: '.hbs',
                        }));
                        await smtpTransport.sendMail(mailOptions);
                        console.log('Send mail to mysmail@mail.com...');
                    } catch (err) {
                        console.log(err);
                    }
                }

                res.json({ success: true, message: 'Document(s) successfuly uploaded.' });
            });
        } catch (err) {
            console.log(err);
        }
    },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...