Node.js 使用Mongoose模式将大型blob数据保存到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

我正在尝试制作一个幻灯片网络应用程序,将在局域网上使用,所以加载时间不应该是一个大问题

我曾经制作过我的锅炉电镀

我查看了一些解决方案,发现哪些功能似乎是我要寻找的。但我似乎无法让它发挥作用。我已经通读了源代码,这一切似乎都有道理

问题出在我的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来访问二进制数据,以执行我需要对其执行的任何操作