NodeJS-Mongo: Опрос базы данных и gridfs и возврат документа и изображения пользователю
Я пытаюсь создать приложение с помощью nodejs,express и mongodb. Я храню изображения с использованием GRIDfs. Я могу получить документ и изображение отдельно.
Как я могу запросить как базу данных mongo, так и gridfs и вернуть как документ, так и изображение в ответ пользователю?
Это мой код ->
wines.js
var mongo = require('mongodb') ;
var Server = mongo.Server,
Db=mongo.Db,
BSON=mongo.BSONPure,
fs = require('fs'),
Binary=mongo.Binary,
GridStore=mongo.GridStore,
Code=mongo.Code,
ObjectID=mongo.ObjectID,
assert=require('assert');
var buffer = "";
var Grid = require('gridfs-stream');
var server = new Server('localhost',27017,{auto_reconnect:true});
db = new Db('winedb',server) ;
db.open(function(err,db){
if(!err){
console.log("Connected to 'wine.db' database") ;
db.collection('wines',{strict:true},function(err,collection){
if(err){
console.log("The 'wines' collection doesn't exist creating it") ;
populateDB() ;
}
});
}
});
exports.findById = function(req,res){
var id = req.params.id ;
console.log('Retrieving wine:'+id) ;
db.collection('wines',function(err,collection){
collection.find({'_id':new BSON.ObjectID(id)}).toArray(function(err,items){
res.writeHead(200,{'Content-Type':'application/json'});
res.writeContinue(items) ;
res.addTrailers({'Content-Type':'image/jpeg'});
var gfs = Grid(db,mongo);
try {
var readstream = gfs.createReadStream({'_id':ObjectID(items[0].image_id)});
readstream.pipe(res);
console.log("sending image") ;
} catch (err) {
console.log(err);
console.log("File not found.");
}
});
});
}
var populateDB = function(){
var wines = [
{
name: "CHATEAU DE SAINT COSME",
year: "2009",
grapes: "Grenache / Syrah",
country: "France",
region: "Southern Rhone",
description: "The aromas of fruit and spice...",
picture: "saint_cosme.jpg"
},
{
name: "LAN RIOJA CRIANZA",
year: "2006",
grapes: "Tempranillo",
country: "Spain",
region: "Rioja",
description: "A resurgence of interest in boutique vineyards...",
picture: "lan_rioja.jpg"
}];
db.collection('wines',function(err,collection){
collection.insert(wines,{safe:true },function(err,result){});
});
var gfs = Grid(db,mongo);
var fileId = new ObjectID();
var writestream = gfs.createWriteStream({
filename:'white',
mode:'w',
contentType:'image/png',
_id:fileId,
});
fs.createReadStream('./images/white.jpg').pipe(writestream);
db.collection('wines',function(err,collection){
collection.update({year:'2009'},{$set:{image_id:fileId}},{safe:true},function(err,result){
if(err){
console.log('Error updating wine:'+err) ;
}
else{
console.log(''+result+'document(s) updated') ;
}
}
)}
);
};
server.js
var express = require('express') ,
wines = require('./routes/wines');
var Grid = require('gridfs-stream') ;
var app = express();
app.configure(function(){
app.use(express.logger('dev'));
app.use(express.bodyParser());
}) ;
app.get('/wines',wines.findAll);
app.get('/wines/:id',wines.findById);
app.post('/wines',wines.addWine) ;
app.put('/wines/:id',wines.updateWine);
app.delete('/wines/:id',wines.deleteWine) ;
app.get('/image/:id',wines.display);
app.listen(3000) ;
console.log('Listening on port 3000') ;
1 ответ
В качестве альтернативы вы можете сохранить свое изображение в S3. Получить URL. Сохраните этот URL в вашем документе BSON. Когда вы отправляете ответ, клиентская сторона запрашивает URL-адрес изображения и отображает URL-адрес.
Это, конечно, если вы рассматриваете только отправку изображения для отображения. Если вам нужно обработать изображение и отправить его между системами, вы можете преобразовать изображение в строку base64 и добавить его в качестве поля в ваш документ BSON. Однако есть, если размер изображения огромен, если может вызвать трафик для нескольких запросов.
Вы также можете использовать Kraken.IO для оптимизации ваших изображений.