Я использовал Node.js и GridFS загружают идентификатор пользователя и имя пользователя в метаданные с файлами изображений, я могу извлекать изображение только тогда, когда метаданные содержат только идентификатор пользователя

#node.js #gridfs #database-metadata

Вопрос:

Я использовал Node.js и GridFS загружают файлы изображений и сохраняют идентификатор пользователя и имя пользователя в метаданных, но я могу получить файл изображения только по идентификатору пользователя, когда метаданные содержат только идентификатор пользователя. Если я сохраню имя пользователя и телефон пользователя в метаданных, я получу пустой список таблиц, и система не отобразит «Файлов не существует !» Частичный код выглядит следующим образом.

        //----------Upload Form-----------
        <form action="/upload" method="post" enctype="multipart/form-data">
        <div class="custom-file mb-3">                            
    <input type="file" class="custom-file-input" name="file" id="file1" 
    onchange="readSingleFile(this.files)">
    <label class="custom-file-label" for="file1" id="file-label">Choose_file</label>
       </div>                            
            <input type="submit" value="Submit" class="btn btn-primary btn-block">
            <input class="metadata"type="text" name="UserID" value="{{user._id}}">
  {{!-- <input class="metadata"type="text" name="UserName" value="    {{user.company_name}}"> 
   <input class="metadata"type="eamil"name="UserPhone" value="{{user.Phone}}"> --}}                    
 </form> 
   //-----********If do not input UserName and UserPhone code works fine ****----
  //--------------------GFS-----------------------------    
   const mongoURI = process.env.MONGODB_URL;
   // connection
   const conn = mongoose.createConnection(mongoURI, {
   useNewUrlParser: true,
   useUnifiedTopology: true,
 });

 let gfs;
 conn.once("open", () => {
  // init stream
 gfs = new mongoose.mongo.GridFSBucket(conn.db, {
 bucketName: "uploads",
 });
 });
 //------------------------Create -storage Engine --------------

  const storage = new GridFsStorage({
 // url: (mongoURI, { useUnifiedTopology: true}),
 url: mongoURI,
 options: { useNewUrlParser: true, useUnifiedTopology: true },
 file: (req, file) => {
 return new Promise((resolve, reject) => {
 crypto.randomBytes(16, (err, buf) => {
    if (err) {
      return reject(err);
    }

    const filename = buf.toString("hex")   path.extname(file.originalname);

    // const UserID = req.body
    const fileInfo = {
      filename: filename,
      bucketName: "uploads",
      metadata: req.body,  // only way to upload metadata
    };

     resolve(fileInfo);
     });
    });
   },
 });

 const upload = multer({ storage });

 //-----------------Retrieve Image file -----------------
 router.get("/pdf/:UserId", isLoggedIn, (req, res) => {
 const file = gfs
 .find({ metadata: { UserID: req.params.UserId } })  // metadata query
 .toArray((err, file) => {
  // Check if file
  if (!file || file.legnth === 0) {
    return res.status(404).json({
      err: "No file exists",
    });
  }
  // return res.json([file]);
  res.render("users/list copy", { list: file });
  
   });
 });

 //-------use hbs Table List all uploaded files -----------
<table class="table table-striped" id="table">
<thead>
    <tr>            
        <th>Date Issued</th>
        <th>File Name</th>
        <th>Company</th>
        <th>Download</th>
        <th>Delete File</th>
     </tr>
   </thead>
  <tbody>
                {{#each list}}
        <tr>                
            <td onclick="State()" class="magnifiable">{{this.uploadDate}}</td>
            <td class="magnifiable">{{this.filename}}</td>
            <td>{{this.metadata.UserName}}</td>          
          
            <td>
                <a href="/image/{{this.filename}}">Statement View
                    <i class="fa fa-usd fa-lg" aria-hidden="true" style="color: orange" aria- 
     hidden="true"></i>
                </a> 
            </td>

            <td>    
                <a href="/file/del/{{this._id}}" onclick="return confirm('Are you sure to 
       delete this record?');" style="color:red"> Remove
                    <i class="fa fa-trash fa-lg" style="color:red" aria-hidden="true"> </i>
                </a>                    
            </td>           
                     {{/each}}         
            </tr>
       </tbody>
    </table>
 

Моя проблема использование req.body в метаданных может сохранить много элементов, но если получить изображение с идентификатором пользователя в метаданных {} Я должен исключить другие поля ввода из формы загрузки. Оставьте там только одно поле ввода UerID. Затем запрос… gfs.find({ метаданные: { Идентификатор пользователя: req.параметры.Идентификатор пользователя } })… работает, и я могу иметь список файлов изображений с длинным шестнадцатеричным code.jpg или pdf. Но мне нужно имя пользователя, чтобы узнать, кто является владельцем файла. Если я не использую запрос метаданных, но используйте ….gfs.find().toArray(…..) ..и у меня могут быть другие поля ввода в форме загрузки , такие как Имя пользователя, в списке таблиц отображается вся загруженная информация о пользователе.

Пожалуйста, помогите мне решить проблему с метаданными.