5

我正在使用 nodejs mongodb mongoose 和 gridfs。当我尝试通过它的 filname 获取文件时,如果我想通过 id 获取它,一切都很好,我得到错误:您要读取的文件不存在。我使用以下代码 console.log("res.pic_id : " + res.pic_id) 我得到了正确的 ObjectId。这是代码:

var GridFS = require('GridFS').GridFS;
var myFS = new GridFS('db');
var fs = require('fs')
var Profile = db.model('Profile');
Profile.findOne({'_id' : clientID},['_id', 'username','pic_id','pic_filename'],function(err, res){
    if (err) { 
        console.log("ERROR serching user info:  " + err);
        callback(JSON.stringify(JSONRes(false, err)));
    }
    else {
         if (res) {
        console.log("res.pic_id : " + res.pic_id);
        myFS.get(res.pic_id,function(err,data){
            if (err)
                console.log("ERROR "+err)
            else {
                callback(data);
            }})
        };
        }
        else {
        callback(JSON.stringify(JSONRes(false, err)));

        }
    }
})

谢谢!

4

3 回答 3

7

我有一个类似的问题。问题原来是我使用的是 ObjectID 的字符串表示,而不是真正的 ObjectID。而不是这个:

var gridStore = new GridStore(db, '51299e0881b8e10011000001', 'r');

我需要这样做:

var gridStore = new GridStore(db, new ObjectID('51299e0881b8e10011000001'), 'r');
于 2013-02-24T05:24:43.280 回答
4

您必须将其存储为文件名或 object.id 作为主键。最好的方法是将它与 ObjectID 作为标识符一起存储,然后将文件名添加到元数据并使用它进行查询。

查看文档中的第三个示例(这是在本机驱动程序的情况下,位于猫鼬下)

http://mongodb.github.com/node-mongodb-native/api-generated/gridstore.html#open

于 2013-01-14T15:58:23.180 回答
0

您可以使用 mongoose 创建一个 Mongodb 对象:

const mongoose = require('mongoose');

const fileId = new mongoose.mongo.ObjectId(req.params.id);`

现在您可以使用 gridfs 和 fileID 获取文件并执行任何其他操作,例如:

let gfs = Grid(mongoose.createConnection(mongoURI), mongoose.mongo);
app.get('URI', function(req, res){  //...

    gfs.files.findOne({_id: fileId}, //callback...

    )
})

这对我来说很好。

于 2018-10-25T23:28:52.743 回答