Node.js 使用Mongoose模式将大型blob数据保存到GridFS
我正在尝试制作一个幻灯片网络应用程序,将在局域网上使用,所以加载时间不应该是一个大问题 我曾经制作过我的锅炉电镀 我查看了一些解决方案,发现哪些功能似乎是我要寻找的。但我似乎无法让它发挥作用。我已经通读了源代码,这一切似乎都有道理 问题出在我的post API中,尽管req.body有req.body.music,其中包含一个大的22MB mp3,但slide.create中的slide变量没有slide.music属性 是否有我遗漏的东西,或者是否有更好的解决方案将大型文件保存到GridFS 下面是我的模式Node.js 使用Mongoose模式将大型blob数据保存到GridFS,node.js,mongodb,express,mongoose,gridfs,Node.js,Mongodb,Express,Mongoose,Gridfs,我正在尝试制作一个幻灯片网络应用程序,将在局域网上使用,所以加载时间不应该是一个大问题 我曾经制作过我的锅炉电镀 我查看了一些解决方案,发现哪些功能似乎是我要寻找的。但我似乎无法让它发挥作用。我已经通读了源代码,这一切似乎都有道理 问题出在我的post API中,尽管req.body有req.body.music,其中包含一个大的22MB mp3,但slide.create中的slide变量没有slide.music属性 是否有我遗漏的东西,或者是否有更好的解决方案将大型文件保存到GridFS
"use strict";
var mongoose = require("mongoose");
var mongooseFS = require("mongoose-fs");
var Schema = mongoose.Schema;
var SlideSchema = new Schema({
name: String,
info: String,
imgData: Buffer,
interval: Number
});
var SlideCollection = new Schema({
name: String,
slideshow: [SlideSchema]
});
SlideCollection.plugin(mongooseFS, {keys: ["music"]});
module.exports = mongoose.model("Slide", SlideCollection);
我的控制器的POST API如下所示
// Creates a new slide in the DB.
exports.create = function(req, res) {
Slide.create(req.body, function(err, slide) {
if(err) { return handleError(res, err); }
return res.status(201).json(slide);
});
};
我无法让mongoose fs工作,但我发现它是基于mongoose fs的,似乎足够简单(或者至少有足够的文档记录)供我使用。我不得不重写我的POST API使其工作,但到目前为止,它给了我想要的功能,即上传大型MP3 我也希望有一个更动态的模式来处理上传大图像,但我认为16mb的限制目前是可行的 这就是我的模式现在的样子
"use strict";
var mongoose = require("mongoose");
var gridStore = require("mongoose-gridstore");
var Schema = mongoose.Schema;
var SlideSchema = new Schema({
name: String,
info: String,
imgData: String,
interval: Number
});
var SlideCollection = new Schema({
name: String,
slideshow: [SlideSchema]
});
SlideCollection.plugin(gridStore);
module.exports = mongoose.model("Slide", SlideCollection);
这是新的PostAPI
// Creates a new slide in the DB.
exports.create = function(req, res) {
var slide = new Slide({
name: req.body.name,
slideshow: req.body.slideshow
});
slide.addAttachment(req.body.name, String(req.body.music))
.catch( function(err) { handleError(res, err); } );
slide.save(function(err, post) {
if(err) { return handleError(res, err); }
return res.status(201).json(post);
});
};
为了完整性起见,这也是我们的收获
// Get a single slide
exports.show = function(req, res) {
Slide.findById(req.params.id, function (err, slide) {
if(err) { return handleError(res, err); }
if(!slide) { return res.status(404).send("Not Found"); }
slide.loadAttachments()
.then(function(doc) {
return res.json(doc);
})
.catch(function(loadingErr) {
throw loadingErr;
});
});
};
然后在Angular中,我需要得到响应。attachements[0]。buffer来访问二进制数据,以执行我需要对其执行的任何操作