我正在使用nodejs mongodb mongoose和gridfs。 当我试图通过它获取一个文件的filname everthing工作得很好,如果我想通过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)));
}
}
})
谢谢!
答案 0 :(得分:5)
我有类似的问题。问题结果是我使用的是ObjectID的字符串表示而不是真正的ObjectID。而不是:
var gridStore = new GridStore(db, '51299e0881b8e10011000001', 'r');
我需要这样做:
var gridStore = new GridStore(db, new ObjectID('51299e0881b8e10011000001'), 'r');
答案 1 :(得分:4)
您必须将其存储为文件名或object.id作为主键。最好的方法是将ObjectID作为标识符存储,然后使用该文件名将元数据添加到元数据和查询中。
查看文档中的第三个示例(这是在本机驱动程序的情况下,位于mongoose下)
http://mongodb.github.com/node-mongodb-native/api-generated/gridstore.html#open
答案 2 :(得分:0)
您可以使用猫鼬创建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...
)
})
那对我来说很好。