Как корректно выполнить обновление поля?

При загрузке файлов, происходит нарушение последовательности, в результате чего, имя файла не удается корректно обновить и поле коллекции filename остается пустым.

const router = require('express').Router();
const mongoose = require("mongoose");
const multer = require('multer');
const aws = require('aws-sdk');
const multerS3 = require('multer-s3');
const Collection = require("../models/ts");

aws.config.update({
    secretAccessKey: process.env.ACCESS_KEY,
    accessKeyId: process.env.ACCESS_KEY_ID,
    region: process.env.REGION
});

const s3 = new aws.S3();
const upload = multer({
    storage: multerS3({
        s3: s3,
        bucket: 'site.com',
        acl: 'public-read',
        key: function (req, file, cb) {
          cb(null, path);
          
           Collection.update({ vid: req.body.vid }, { $set: {
            filename: file.originalname,
            } })
      .exec()
      .then(result => {
        console.log('Название файла успешно сохранено');
        })
      .catch(err => {
        console.log(err);
      });
          }
      })
}).any();

router.post("/", upload,(req, res, next) => {
switch(req.body.cs) {

case "addCollection":
 
  const ts = new Collection({
   _id: new mongoose.Types.ObjectId(),
   vid: req.body.vid,	
   filename: ''
  });
  
  ts.save()
  .then(result => {
    if(result){
    console.log('Данные успешно записан в коллекцию');
  } else {
    console.log('Данные в коллекцию не записаны');
  }
  })
  .catch(err => {
        console.log('Ошибка записи в коллекцию');
    });

  res.status(200).json({
    "result":"ok",
  });
  break;

case "addFilename":
	upload(req, res, function (err) {

      if(err) {
        console.log('Ошибка загрузки файлов');
        res.status(500).json({
          Error: "Ошибка загрузки файлов"
        });
        }

        res.status(200).json({
          "result":"ok",
        });
      });
  break;
}
});


В 2х словах, в addCollection происходит сохранение полей, с пока пустым полем filename, а в addFilename уже получаем сам файл и обновляем filename его именем.
В результате кода выше, в консоли получаем следующее:

Название файла успешно сохранено
Данные успешно записан в коллекцию


Из этого следует, что обновление поля filename происходит раньше фактического появления самой записи в коллекции.
Помогите корректно обработать эту ситуацию.
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 1
IvanBlacky
@IvanBlacky
back-end разработчик
Вот ваш код, который сообщает о том, что запись добавлена в коллекцию:
res.status(200).json({
    "result":"ok",
  });
  break;


Однако, это сообщение ложно, так как этот код вызывается не в цепочке промиса на добавление файла. Соответственно, нужно написать так:
ts.save()
  .then(result => {
    if(result){
    console.log('Данные успешно записан в коллекцию');
      res.status(200).json({
        "result":"ok",
       });
  } else {
    console.log('Данные в коллекцию не записаны');
  }
  })
  .catch(err => {
        console.log('Ошибка записи в коллекцию');
    });
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы