2016-01-28 2 views
1

Я пытаюсь изменить некоторые двоичные данные из моих загруженных изображений на base64, поэтому я могу использовать их для отображения изображения. Но terimal дает мне эту ошибку:Застрял при изменении двоичных данных на base64 (Gridfs-stream)

TypeError: Cannot read property 'on' of undefined 

Я не понимаю, когда я отправляю я также использую событие .На и он работает нормально. Кроме того, мне интересно, правильно ли я изменяю данные.

Просьба принять во внимание, что я довольно новый к узлу :)

Как сохранить загруженное изображение (POST)

// Post to profile page 
 
router.post('/', function(req, res, next) { 
 
    \t var busboy = new Busboy({ headers: req.headers }); 
 
\t busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
 
\t \t var conn = mongoose.createConnection('192.168.99.100:32773'); 
 
\t \t conn.once('open', function() { 
 
\t \t \t var gfs = Grid(conn.db); 
 
\t \t  var writestream = gfs.createWriteStream({ 
 
\t \t  \t filename: filename, 
 
\t \t  \t content_type: mimetype, 
 
\t \t  \t mode: 'w', 
 
\t \t  \t metadata: { 
 
\t \t   \t belongs_to: req.session.passport.user 
 
\t \t  \t } 
 
\t \t  }); 
 

 
\t \t  file.pipe(writestream); 
 
\t \t  writestream.on('close', function(file){ 
 
\t \t \t  res.render('profile', { 
 
\t \t \t  \t user: req.user, 
 
\t \t \t  \t message: req.flash('uploadMessage', 'Your image has been uploaded successfully!') 
 
\t \t \t  }) 
 
\t \t  }) 
 
\t \t }) 
 
\t }) 
 
\t req.pipe(busboy); 
 
});

Здесь я стараюсь для получения изображения и преобразования двоичных данных в base64 (GET)

// GET to index 
 
router.get('/', function(req, res){ 
 
\t var conn = mongoose.createConnection('192.168.99.100:32773'); 
 
\t conn.once('open', function() { 
 
\t \t var gfs = Grid(conn.db); 
 
\t \t var readstream = gfs.createReadStream({ 
 
\t \t \t filename: 'kittendj.jpg' 
 
\t \t }); 
 
\t \t readstream.pipe(); 
 
\t \t readstream.on('open', function(chunk){ 
 
\t \t \t bufs.push(chunk); 
 
\t \t }) 
 
\t \t readstream.on('close', function(){ 
 
\t \t \t var bufs = []; 
 
\t \t  var fbuf = Buffer.concat(bufs); 
 
\t \t  var base64 = (fbuf.toString('base64')); 
 
\t \t  res.render('index', { 
 
\t \t \t \t isAuthenticated: req.isAuthenticated(), 
 
\t \t \t \t user: req.user, 
 
\t \t \t \t imageSrc: '<img src="data:image/jpeg;base64,' + base64 + '">' 
 
\t \t \t }) 
 
\t \t }) 
 
\t }) 
 
});

Ресурсы Я проверил:

+0

использовать более полуколоны, он может начать работать. – dandavis

+0

@ dandavis Точка с запятой на самом деле необязательна, если я не ошибаюсь, потому что ECMAScript (стандарт для реализации Node.js и браузера JavaScript) имеет функцию автоматической точки с запятой. Поэтому я не уверен, что проблема там, но не стесняйтесь доказать мне, что не так :) – Murderlon

ответ

1

Я также ищет решения, чтобы прочитать изображение из gridfs и я использую gridfs Strem

это решение, которое я нашел, надеюсь, что это полезно для вас.

// настроить gridfs

import mongoose from 'mongoose'; 
import Grid from 'gridfs-stream'; 

const db = mongoose.connection.db; 
const mongoDriver = mongoose.mongo; 
const gfs = new Grid(db, mongoDriver); 

// Записываем образ Монго

const writeStream = gfs.createWriteStream({ 
    filename: 'test.png', 
    content_type: 'image/png', 
}); 
fs.createReadStream(filePath).pipe(writeStream); 

writeStream.on('close', (gfsFile) => { 
    // remove the original file 
    fs.unlink('test.png'); 
    // this is the information, and _id is the id 
    console.log(gfsFile); 
}); 

// прочитать файл в Монго

const readstream = gfs.createReadStream({ 
    _id: id, 
}); 

const bufs = []; 
readstream.on('data', function (chunk) { 
    bufs.push(chunk); 
}); 
readstream.on('end', function() { 
    const fbuf = Buffer.concat(bufs); 
    const base64 = fbuf.toString('base64'); 
    console.log(base64); 
});