После рефакторинга AWS S3 Uploader для повторного использования кода загрузчик не запускается - PullRequest
1 голос
/ 17 июня 2020

Рассмотрим контроллер:

authControoler:

const mongoose = require('mongoose');
const User = mongoose.model("User");
const crypto = require('crypto');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const { JWT_SECRET } = require('../config/keys');
const AWS = require('aws-sdk');
const multer = require("multer");
const multerS3 = require("multer-s3");
const uuid = require('uuid');

const s3 = new AWS.S3({
    accessKeyId: process.env.AWS_ACCESS_KEY,
    secretAccessKey: process.env.AWS_SECRET_KEY,
    region: process.env.AWS_REGION,
});

const uuid_name = uuid.v4();
const signUpUploader = multer({
    storage: multerS3({
        s3: s3,
        bucket: process.env.AWS_S3_BUCKET_NAME,
        metadata: function (req, file, cb) {
            console.log("Uploading file to S3...");
            cb(null, {
                OriginalFileName: file.originalname.toLowerCase(),
                RandomName: uuid_name,
            });
        },
        key: function (req, file, cb) {
            cb(null, file.originalname);
        }
    })
}).single('singleFile');


exports.signUp = async (req, res, next) => {

    // call the uploader to AWS S3
    signUpUploader(req, res, function (err) {
        if (err) {
            // An error occurred when uploading 
            console.log('Something went wrong :', err);
            return;
        }
        // Everything went fine 
        console.log('Everything went fine');

        const image_s3_url = req.file.location;
        const { name, email, password } = req.body;

        if (!email || !password || !name) {
            return res.status(422).json({ error: "please add all the fields" })
        }

        // update User in Mongo ...
    });

};

Я преобразовал код в повторно используемый aws код, как показано ниже:

aws. js:

const AWS = require('aws-sdk');
const multer = require("multer");
const multerS3 = require("multer-s3");
const uuid = require('uuid');
const uuid_name = uuid.v4();

const s3 = new AWS.S3({
    accessKeyId: process.env.AWS_ACCESS_KEY,
    secretAccessKey: process.env.AWS_SECRET_KEY,
    region: process.env.AWS_REGION,
});

module.exports = class AWSUtils {

    constructor(filePropertyName) {
        this.filePropertyName = filePropertyName;
    }

    getFilePropertyName() {
        return this.filePropertyName;
    }

    uploadImage() {
        const signUpUploader = multer({
            storage: multerS3({
                s3: s3,
                bucket: process.env.AWS_S3_BUCKET_NAME,
                metadata: function (req, file, cb) {
                    console.log("Uploading file to S3...");
                    cb(null, {
                        OriginalFileName: file.originalname.toLowerCase(),
                        RandomName: uuid_name,
                    });
                },
                key: function (req, file, cb) {
                    cb(null, file.originalname);
                }
            })
        }).single(this.filePropertyName);

        return signUpUploader;
    }

}

authControoler:

const mongoose = require('mongoose');
const User = mongoose.model("User");
const crypto = require('crypto');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const { JWT_SECRET } = require('../config/keys');
const AWSUtils = require('../utils/aws');
const _utils = new AWSUtils('singleFile');

exports.signUp = async (req, res, next) => {
    console.log('In signUp');
    // call the uploader to AWS S3

    _utils.uploadImage(req, res, function (err) {                 // Refactored !!!
        if (err) {
            // An error occurred when uploading 
            console.log('Something went wrong :', err);
            return;
        }
        // Everything went fine 
        console.log('Everything went fine');

        const image_s3_url = req.file.location;
        const { name, email, password } = req.body;

        if (!email || !password || !name) {
            return res.status(422).json({ error: "please add all the fields" })
        }

             // update User in Mongo ...
    });

};

После рефакторинга и извлечения AWS код в отдельный файл (aws. js), я звоню uploadImage, но ничего не происходит, ни ошибок, ни загрузки, ничего.

Что мне здесь не хватает?

1 Ответ

1 голос
/ 17 июня 2020

multer возвращает функцию Express промежуточного программного обеспечения. В исходном коде эта функция промежуточного программного обеспечения была назначена непосредственно на signUpUploader

. В вашем отредактированном коде функция _util.uploadImage фактически возвращает функцию промежуточного программного обеспечения, но в вашем коде вы не используете результат в качестве промежуточного программного обеспечения, вместо этого пытайтесь использовать _util.uploadImage.

Есть несколько вариантов, но быстрое исправление будет заключаться в следующем:

Заменить:

_utils.uploadImage(req, res, function (err) { 
 // The function body
})

С:

const signUpUploader = _utils.uploadImage();
signUpUploader(req, res, function (err) {
 // The function body
})

Это будет использовать промежуточное ПО mutler так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...