Node.js 错误:必须打开数据库连接才能存储文件

Node.js 错误:必须打开数据库连接才能存储文件,node.js,mongodb,multer,gridfs,Node.js,Mongodb,Multer,Gridfs,我正在使用mongodb atlas在云中存储数据,但我无法存储数据,因为我不断收到相同的错误 错误:必须打开数据库连接才能存储文件 我的服务器端代码 const mongoURI='mongodb+srv://caman3874:qwertyuiopaman1234@@amanco pexfz.mongodb.net/test?retryWrites=true&w=maist'; const conn=mongoose.createConnection(mongoURI,{useNewUrl

我正在使用mongodb atlas在云中存储数据,但我无法存储数据,因为我不断收到相同的错误 错误:必须打开数据库连接才能存储文件

我的服务器端代码


const mongoURI='mongodb+srv://caman3874:qwertyuiopaman1234@@amanco pexfz.mongodb.net/test?retryWrites=true&w=maist';
const conn=mongoose.createConnection(mongoURI,{useNewUrlParser:true});
让gfs;
连接一次('打开',()=>{
gfs=网格(conn.db,mongoose.mongo);
gfs.集合(“上传”);
console.log(“连接成功”);
});
const storage=新的GridFsStorage({
网址:mongoURI,
文件:(请求,文件)=>{
返回新承诺((解决、拒绝)=>{
加密随机字节(16,(err,buf)=>{
如果(错误){
退货拒绝(err);
}
const filename=buf.toString('hex')+path.extname(file.originalname);
常量文件信息={
filename:filename,
bucketName:“上传”
};
解决(文件信息);
});
});
}
});
const upload=multer({storage});
应用程序获取(“/”,(请求,请求)=>{
res.render(“索引”);
});
app.post('/upload',upload.single('file'),(req,res)=>{
res.json({file:req.file});
});
常数端口=5000;
app.listen(端口,()=>console.log(`Server start on port${port}`));
我的html代码

<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
    crossorigin="anonymous">

  </style>
  <title>Mongo File Uploads</title>
</head>

<body>
  <div class="container">
    <div class="row">
      <div class="col-md-6 m-auto">
        <form action="/upload" method="POST" enctype="multipart/form-data">
          <div class="custom-file mb-3">
            <input type="file" name="file" id="file" class="custom-file-input">
            <label for="file" class="custom-file-label">Choose File</label>
          </div>
          <input type="submit" value="Submit" class="btn btn-primary btn-block">
        </form>
      </div>
    </div>
  </div>

  <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
    crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
    crossorigin="anonymous"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
    crossorigin="anonymous"></script>
</body>

</html>

Mongo文件上传
选择文件
错误:必须打开数据库连接才能存储文件 位于GridFSStorage.\u handleFile(C:\Users\91807\Desktop\mongo\node\u modules\multer gridfs storage\lib\gridfs.js:339:17) 在C:\Users\91807\Desktop\mongo\node\u modules\multer\lib\make middleware.js:144:17 在allowAll(C:\Users\91807\Desktop\mongo\node\u modules\multer\index.js:8:3) 在wrappedFileFilter(C:\Users\91807\Desktop\mongo\node\u modules\multer\index.js:44:7) 在公共汽车上。(C:\Users\91807\Desktop\mongo\node\u modules\multer\lib\make middleware.js:114:7) 在Busboy.emit(events.js:209:13) 在Busboy.emit(C:\Users\91807\Desktop\mongo\node\u modules\Busboy\lib\main.js:38:33) 在PartStream。(C:\Users\91807\Desktop\mongo\node\u modules\busboy\lib\types\multipart.js:213:13) 在PartStream.emit(events.js:209:13) 在HeaderParser。(C:\Users\91807\Desktop\mongo\node\u modules\dicer\lib\dicer.js:51:16) 在HeaderParser.emit(events.js:209:13) 在HeaderParser.\u finish(C:\Users\91807\Desktop\mongo\node\u modules\dicer\lib\HeaderParser.js:68:8) 在SBMH。(C:\Users\91807\Desktop\mongo\node\u modules\dicer\lib\HeaderParser.js:40:12) 在SBMH.emit(events.js:209:13) 在SBMH.\u SBMH\u提要(C:\Users\91807\Desktop\mongo\node\u modules\streamsearch\lib\SBMH.js:159:14) 在SBMH.push(C:\Users\91807\Desktop\mongo\node\u modules\streamsearch\lib\SBMH.js:56:14)


希望这能奏效

只需创建一个promise并使用连接URI传递mongoose实例。你可能也需要统一的拓扑。
const mongoURI = 'mongodb+srv://caman3874:qwertyuiopaman1234@@amanco-pexfz.mongodb.net/test?retryWrites=true&w=majority';

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

const conn = mongoose.connection;
let gfs;

conn.once('open',() => {
  gfs = Grid(conn, mongoose.mongo);
  gfs.collection('uploads');
});

//create storage object
const storage = new GridFsStorage({
  db: promise,
  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 fileInfo = {
          filename: filename,
          bucketName: 'uploads'
        };
        resolve(fileInfo);
      });
    });
  }
});
const upload = multer({ storage });