Skip to content

Instantly share code, notes, and snippets.

@tshaddix
Last active February 21, 2018 22:33
Show Gist options
  • Save tshaddix/05a8aebf143fa30e8b07 to your computer and use it in GitHub Desktop.
Save tshaddix/05a8aebf143fa30e8b07 to your computer and use it in GitHub Desktop.
Busboy + GridFS + Express4
var Busboy = require('busboy'),
Grid = require('gridfs-stream'),
mongoose = require('mongoose'),
router = module.exports = require('express').Router();
var gfs = new Grid(mongoose.connection.db, mongoose.mongo);
router
.get('/:item/receipt/info', function(req, res, next){
gfs.files.find({
_id : req.item.receipt
}).toArray(function(err, files){
if(err) return next(err);
if(files.length === 0){
return next(new Error('File does not exist'));
}
var file = files[0];
res.json(200, file);
});
})
.get('/:item/receipt', function(req, res, next){
gfs.files.find({
_id : req.item.receipt
}).toArray(function(err, files){
if(err) return next(err);
if(files.length === 0){
return next(new Error('File metadata does not exist'));
}
var file = files[0];
var rs = gfs.createReadStream({
_id : req.item.receipt
});
res.writeHead(200, {
'Content-Type' : file.contentType,
'Content-Length' : file.length
});
rs.pipe(res);
});
})
.post('/:item/receipt', function(req, res, next){
if(req.item.receipt){
return res.json(400, {
detail : 'Item already has receipt.'
});
}
var _returns = 0;
var _files = 0;
var _receipt = undefined;
var _error = undefined;
var _return = function(error){
_returns++;
if(error){
_error = error;
}
if(_returns === _files + 1){
if(_error){
res.json(500, {
detail : error
});
} else if(_files === 0){
res.json(400, {
detail : 'No file attached.'
});
} else {
res.json(200, {
_id : _receipt
});
}
}
};
var busboy = new Busboy({
headers: req.headers,
limits : {
files : 1
//fileSize : 5242880 // 5mb
}
});
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
if (fieldname === 'receipt') {
_files++;
var ws = gfs.createWriteStream({
mode: 'w',
content_type: mimetype,
filename: filename,
metadata: {
//Any props you want to add
}
});
ws.on('close', function (file) {
req.item.receipt = file._id;
req.item.save(function(err){
if(err){
console.error(err);
_return('Could not save file to db.');
} else {
_receipt = file._id;
_return();
}
});
});
file.pipe(ws);
} else {
file.resume();
}
});
busboy.on('finish', function(){
_return();
});
req.pipe(busboy);
})
.delete('/:item/receipt', function(req, res, next){
if(!req.item.receipt){
return res.json(400, {
detail : 'Item does not have a receipt'
});
}
gfs.remove({ _id : req.item.receipt }, function(err){
if(err) return next(err);
req.item.receipt = undefined;
req.item.save(function(err){
if(err) return next(err);
res.json(200, req.item);
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment