使用mongoose将带有graphql的文件上传到mongodb

问题描述

我想使用graphql解析器将文件上传到mongodb。 在server.js中,我具有此帮助功能来存储文件,该文件被导出以在解析器中使用。 该函数基于我在这里找到的内容https://github.com/jaydenseric/graphql-upload/issues/8),但是现在graphql中的某些事情已经改变。例如,解构文件对象。我不知道应该在路径变量中找到什么,以及如何使用此createReadStream(已从文件中解构的函数)。

const mongoose = require('mongoose');
const Grid = require('gridfs-stream');
const fs = require('fs');

//...

// Connect to Mongo
mongoose
  .connect(process.env.mongoURI,{
    useNewUrlParser: true,useCreateIndex: true,useUnifiedTopology: true,useFindAndModify: false
  }) // Adding new mongo url parser
  .then(() => console.log('MongoDB Connected...'))
  .catch(err => console.log(err));




const storeFile = async (upload) => {
   const { filename,createReadStream,mimetype } = await upload.then(result => result);

   const bucket = new mongoose.mongo.GridFSBucket(mongoose.connection.db,{ bucketName: 'files' });

   const uploadStream = bucket.openUploadStream(filename,{
     contentType: mimetype
   });
   createReadStream()
     .pipe(uploadStream)
     .on('error',console.log('error'))
     .on('finish',console.log('finish'));
 }

module.exports = { storeFile }
//...

我的解析器(这里是最低版本,因为现在我只想将文件上传数据库中。在我的一次尝试中,它甚至创建了fs.files和fs.chunks集合,但没有数据):

Mutation: {
    uploadFile: async (_,{ file }) => {
      console.log(file);
      const fileId = await storeFile(file);

      return true;
     
    }
  }

我现在遇到此错误

未处理的拒绝(错误):GraphQL错误:“侦听器”参数 必须是函数类型。收到未定义

在终端中,我已经打印了“错误”(例如在pipe.on('error',console.log('error')语句)

我只能上传文件(最大60 kb),所有大文件只是不上传,但是所有尝试都显示错误

解决方法

好,我设法解决了。

解析器突变:

const { storeFile } = require('../../server');
//...

uploadFile: async (_,{ file }) => {
      const fileId = await storeFile(file).then(result => result);

      return true;
// later I will return something more and create some object etc.
    }

server.js的支持功能

 const storeFile = async (upload) => {
    const { filename,createReadStream,mimetype } = await upload.then(result => result);

    const bucket = new mongoose.mongo.GridFSBucket(mongoose.connection.db,{ bucketName: 'files' });
    
    const uploadStream = bucket.openUploadStream(filename,{
      contentType: mimetype
    });
    return new Promise((resolve,reject) => {
      createReadStream()
        .pipe(uploadStream)
        .on('error',reject)
        .on('finish',() => {
            resolve(uploadStream.id)
        })
    })
  }

  module.exports = { storeFile }