Как прикрепить информацию метаданных к файлу документа Gridfs? - PullRequest
0 голосов
/ 24 апреля 2020

Я успешно отправил файл в базу данных, используя multer-gridfs-storage, но единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу добавить дополнительную информацию, такую ​​как AccountID, UserName и т. Д., В объект метаданных в db.i. пытался прикрепить эту информацию, как эта file[0].AccountID="145236, прежде чем добавлять ее в форму данных, но при отправке ее объект метаданных БД был пустым. Может ли кто-нибудь помочь мне, пожалуйста,

код бэкенда:

const express = require("express");
const path = require("path");
const mongoose = require("mongoose");
const multer = require("multer");
const cors = require("cors");
const GridFsStorage = require("multer-gridfs-storage");
const Grid = require("gridfs-stream");
const crypto = require("crypto");
const router = express.Router();
const app = express();

app.use(express.json());
app.use(cors());

//Connect to DB
const mongoURI =
 my-mongo-uri;

const conn = mongoose.createConnection(mongoURI);

mongoose.connect(mongoURI, { useNewUrlParser: true });

let gfs;
conn.once("open", () => {
  gfs = Grid(conn.db, mongoose.mongo);
  gfs.collection("Cours");
  console.log("Connection Successful");
});

// Create storage engine
const storage = new GridFsStorage({
  url: mongoURI,
  file: (req, file) => {
    return new Promise((resolve, reject) => {
      crypto.randomBytes(16, (err, buf) => {
        if (err) {
          return reject(err);
        }
        const filename = file.originalname;
        const fileInfo = {
          filename: filename,
          bucketName: "Cours",
          metadata: {}, // i want to store additional information here 
        };
        resolve(fileInfo);
      });
    });
  },
});

const upload = multer({ storage });

router.post("/", upload.single("img"), (req, res, err) => {
  if (res) {
    res.json({ message: "Cours envoyé avec succès" });
  } else {
    if (err) {
      res.json({ message: "Échec d'envoi" });
    }
  }
});
module.exports = router;

Код внешнего интерфейса:

import React, { useState, useEffect } from "react";
import { connect } from "react-redux";
import { setAlert } from "../../actions/alert";
import Alert from "../../Components/alert";
import { usePromiseTracker } from "react-promise-tracker";
import { trackPromise } from "react-promise-tracker";
import PropTypes from "prop-types";
const Cours = ({ setAlert, auth: { user } }) => {
  const Post = (e) => {
    e.preventDefault();
    const file = document.getElementById("inputGroupFile01").files;
    const formData = new FormData();
    formData.append("img", file[0]);

    trackPromise(
      fetch("/UploadCours/", {
        method: "POST",
        body: formData,
      }).then((res) =>
        setAlert(
          typeof file[0] === "undefined"
            ? "Veuillez insérer un fichier"
            : "Cours publié avec succès",
          typeof file[0] === "undefined" ? "danger" : "success"
        )
      )
    );
  };
  const { promiseInProgress } = usePromiseTracker();
  return (
    <div className="col p-3  ">
      <div classname="container">
        <Alert />
        <h1 className="mb-3">Publier Cours </h1>
        <form>
          <div className="input-group mb-3 w-50">
            <div className="custom-file">
              <input
                type="file"
                className="custom-file-input "
                id="inputGroupFile01"
                aria-describedby="inputGroupFileAddon01"
                required
              />
              <label className="custom-file-label" htmlFor="inputGroupFile01">
                Choose file
              </label>
            </div>
          </div>
          {promiseInProgress ? (
            <button type="button" className="btn btn-primary">
              <i
                className="fa fa-refresh fa-spin"
                style={{ marginRight: "5px" }}
              />
              Uploading ...
            </button>
          ) : (
            <button
              type="button"
              className="btn btn-primary"
              onClick={(e) => Post(e)}
            >
              Upload
            </button>
          )}
        </form>
      </div>
    </div>
  );
};
Cours.prototype = {
  auth: PropTypes.object.isRequired,
};
const mapStateToProps = (state) => ({
  auth: state.auth,
});
export default connect(mapStateToProps, { setAlert })(Cours);

желаемый результат: ссылка на изображение

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