Сохранение идентификатора MongoDB в качестве моего ключа на Amazon S3

#node.js #mongodb #amazon-s3

#node.js #mongodb #amazon-s3

Вопрос:

Я создал функциональность для одновременного сохранения записи в моей базе данных MongoDB и загрузки изображений на Amazon S3. Все работает нормально. Однако в этом процессе я также хочу сохранить идентификатор данных из моего MongoDB в качестве ключа при загрузке на Amazon S3.

Я пытался поиграть с ‘req.params.id ‘ и так далее, но он просто возвращается как неопределенный.

Есть ли действительно очевидный способ сделать это? Надеюсь, я упускаю что-то простое.

Код:

  const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'example',
    metadata: function (req, file, cb) {
      cb(null, {fieldName: file.fieldname});
    },
    contentType: multerS3.AUTO_CONTENT_TYPE,
    acl: 'public-read',
    key: function (req, file, cb) {
      cb(null, `${req.body.id}`
        // Date.now().toString()
      );
    }
  })
});

module.exports = (req, res) => {
  HouseListing.create(req.body, (error, houselisting) => {
    if (error) {
      const validationErrors = Object.keys(error.errors).map(key => error.errors[key].message);
      req.flash('validationErrors', validationErrors);
      return res.redirect("/houseListing");
    }
    console.log(req.files);
    console.log(req.body.mainImages);
    console.log(req.body.id);
    res.redirect("/");
  });
};
  

Два нижних журнала консоли моей функции базы данных возвращают ‘undefined’. Как и функция загрузки.

Есть советы? 🙂 Пожалуйста, дайте мне знать, если я пропустил какую-либо информацию!

Комментарии:

1. Отправляет ли клиент идентификатор в сообщении? Я предполагаю, что идентификатор будет создан mongo, поэтому загрузка может произойти только после…

2. Да, извиняюсь — я имею в виду идентификатор, созданный Mongo автоматически. Нет ввода от клиента.

3. Тогда он должен быть в houselisting._id

4. Хорошо, спасибо. Но как мне получить к нему доступ в моем вызове загрузки на S3, чтобы сохранить ключ в качестве идентификатора? Я, вероятно, должен был отметить, что они находятся в отдельных контроллерах — мой вызов S3 находится в моем server.js (где находится мой запрос POST) и моя функция создания базы данных находятся в отдельном файле.

5. Ну, я бы сказал, разархивируйте их… Это по тому же запросу? Тогда ваш контроллер должен обрабатывать это, ничего больше. Это 2 разных запроса? Опубликуйте список домов, а затем вы сможете опубликовать файлы, используя предоставленный идентификатор… Но как вы будете управлять правами на загрузку изображения для определенного списка, если вы не обрабатываете его в контроллере???