Экспресс-многократная проверка запроса перед загрузкой файла

#node.js #express #multer #multer-s3

#node.js #экспресс #многократная #multer-s3

Вопрос:

В настоящее время я использую multer-s3 (https://www.npmjs.com/package/multer-s3 ) чтобы загрузить один CSV-файл в S3, у меня это работает следующим образом:

 var multer = require('multer');
var multerS3 = require('multer-s3');
var AWS = require('aws-sdk');

AWS.config.loadFromPath(...);
var s3 = new AWS.S3(...);

var upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'my-bucket',
    metadata: function (req, file, cb) {
      cb(null, {fieldName: file.fieldname});
    },
    key: function (req, file, cb) {
      cb(null, Date.now().toString())
    }
  })
});
  

затем он маршрутизируется следующим образом:

 app.route('/s3upload')
  .post(upload.single('data'), function(req, res) {

    // at this point the file is already uploaded to S3 
    // and I need to validate the token in the request.

    let s3Key = req.file.key;

  });
  

Мой вопрос в том, как я могу проверить объект запроса до того, как Multer загрузит мой файл в S3.

Ответ №1:

Вы можете просто подключить еще одно промежуточное программное обеспечение перед загрузкой, а затем проверить токен там

 function checkToken(req, res) {
    // Logic to validate token
}

app.route('/s3upload')
  .post(checkToken, upload.single('data'), function(req, res) {

    // at this point the file is already uploaded to S3 
    // and I need to validate the token in the request.

    let s3Key = req.file.key;

  });
  

Ответ №2:

Просто еще один уровень для проверки. Вы можете использовать Joi для проверки вашего запроса. Перед сохранением ваших данных.

 //router.ts
router.post('/', Upload.single('image'), ProductController.create);

//controller.ts
export const create = async(req:Request,res:Response) => {

   const image = (req.file as any).location;
   const body = { ...req.body, image: image }

   const { error } = validate(body);
   if (error) return res.status(400).send(error.details[0].message);

   const product = await ProductService.create(body);

   res.status(201).send(product); 
}

//product.ts 
function validateProduct(product : object) {
  const schema = Joi.object({
      name: Joi.string().min(5).max(50).required(),
      brand: Joi.string().min(5).max(50).required(),
      image: Joi.string().required(),
      price: Joi.number().required(),
      quantity:Joi.number(),
      description: Joi.string(),
  });

  return schema.validate(product);  
}