Gridfs和mongoose文件上传

时间:2017-10-12 08:59:13

标签: node.js mongodb mongoose gridfs gridfs-stream

我遇到了gridfs文件上传的问题。 基本上我得到了这个奇怪的错误,我还没有找到解决这个问题的解决方案。

以下是我应该处理文件上传的代码:

var path = require('path');
var router = require('express').Router();
var mongoose = require('mongoose');
var serverConfig = require('../config.js');
var multiparty = require('connect-multiparty')();
var fs = require('fs');
var GridFs = require('gridfs-stream');


var db = mongoose.connection.db;
var mongoDriver = mongoose.mongo;
var gfs = new Gridfs(db, mongoDriver);

router.post('/upload', multiparty, function(req, res){
    console.log("file was posted");
    var writestream = gfs.createWriteStream({
        filename: req.files.file.name + Date.now(),
        mode: 'w',
        content_type: req.files.file.mimetype,
        metadata: req.body
    });
    fs.createReadStream(req.files.file.path).pipe(writestream);
    writestream.on('close', function(file){
        res.status(200).json(file);
    })
})

尝试运行我的代码时,出现此错误:

if (!db) throw new Error('missing db argument\nnew Grid(db, mongo)');
           ^

Error: missing db argument
new Grid(db, mongo)

我使用Mongoose版本4.11.12和Gridfs-stream版本1.1.1
是否有人知道应该采取什么措施让这件事有效?

2 个答案:

答案 0 :(得分:0)

看起来mongoose.connection.db没有引入数据库名称,因为它可能在连接字符串中丢失,您的连接字符串应该看起来像'mongodb://username:password@host:port/database?options...',其中database是您要连接的数据库。

或者你可以直接替换

var db = mongoose.connection.db;
var mongoDriver = mongoose.mongo;
var gfs = new Gridfs(db, mongoDriver);

var mongoDriver = mongoose.mongo;
var gfs = new Gridfs("myDatabase", mongoDriver);

答案 1 :(得分:-1)

我是一个初学者,一直遇到同样的问题。经过数小时的调试和阅读后,我终于弄明白了。连接数据库仅在数据库连接后确定。在此之前,根本没有要读取的数据库。这特别不幸,因为数据库是异步连接的,因此,除非您找到一种异步调用它的方法,否则您实际上将永远无法访问std::array,此example可以正常工作对我来说。

如果您具有应用程序路由的功能和连接到数据库的功能在同一个文件中,那么这很简单,您可以执行以下操作

std::index_sequence

函数#include <array> #include <ios> // std::boolalpha #include <iostream> #include <utility> // std::(make_)index_sequence namespace detail { template <typename Array, typename UnaryPredicate, std::size_t... I> bool one_of_impl(const Array& arr, const UnaryPredicate& p, std::index_sequence<I...>) { bool found = false; auto keep_searching = [&](const int n){ const bool p_res = found != p(n); found = found || p_res; return !found || p_res; }; return (keep_searching(arr[I]) && ...) && found; } } // namespace detail template <typename T, typename UnaryPredicate, std::size_t N, typename Indices = std::make_index_sequence<N>> auto one_of(const std::array<T, N>& arr, const UnaryPredicate& p) { return detail::one_of_impl(arr, p, Indices{}); } int main() { const std::array<int, 5> a{1, 3, 5, 6, 7}; std::cout << std::boolalpha << "Exactly one even number : " << one_of(a, [](const int n) { return n % 2 == 0; }); // Exactly one even number : true } 应该将所有被称为mongoose.connection.db的文件包装&&此包装器也应该位于声明与数据库的连接的同一文件中,否则, mongoose.connect(DB_URI, {useNewUrlParser: true}); mongoose.connection.once("open", () => { //Declare any files containing your routes in which you call mongoose.connection.db const itemRoutes = require("./api/routes/items"); //Insert their routes... app.use("/items", itemRoutes); //Start the app app.listen(port, () => console.log(`Server started on port ${port}`)); }) 在无法将其识别为函数的地方引发错误,但是如果满足这两个条件,则它应该可以工作。否则,似乎会出现各种奇怪的错误。

再一次,我是一个初学者。但是由于某种原因,似乎没有人更了解这个问题。如果有其他人可以对此做出更好的贡献,我将不胜感激。无论哪种方式,我都希望能对某人有所帮助。