2015-03-01 6 views
2

Я новичок в Node.js и Express.js.ExpressJS Multer: Загрузить картинку на сервер

Я хочу загрузить сначала изображение на сервер (каталог: uploads/spot), а затем (синхронно) загрузить остальные данные формы в MongoDB.

Я использую REST (метод Post)

app.route ('/') пятна пост (users.requiresLogin, spots.create).

и я использую Multer для обновления изображения на сервере и работает.

app.use(multer(
 
     { dest: './public/uploads/spots', 
 
      onFileUploadStart: function (file) { 
 
       var imagePath = file.path; 
 

 
       gm(imagePath).resize(850, 850).quality(70).noProfile().write('public/uploads/spots/850x850/'+file.name, function (err) { 
 
        if (!err) { 
 
         gm(imagePath).resize(150, 150).quality(70).noProfile().write('public/uploads/spots/150x150/'+file.name, function (err) { 
 
          if (!err) { 
 
          } 
 
          else{ 
 
           console.log('Error: '+err); 
 
          } 
 

 
         }); 
 
        } 
 
        else{ 
 
         console.log('Error: '+err); 
 

 
        } 
 

 
       }); 
 

 
      } 
 

 
     }));

работает, но является асинхронным, и возвращает ответ на FRONTEND до того, что изображение будет загрузить на сервер.

Мой вопрос заключается в том, как это сделать, но синхронно и как вернуть ответ интерфейсу после того, как изображение было загружено.

Спасибо!

spots.server.routes.js

'use strict'; 
 

 
module.exports = function(app) { 
 
    var gm = require('gm'); 
 
    var multer = require('multer'); 
 

 

 
    var users = require('../controllers/users.server.controller.js'); 
 
    var spots = require('../controllers/spots.server.controller.js'); 
 

 

 
    //Upload image 
 
    app.use(multer(
 
     { dest: './public/uploads/spots', 
 
      onFileUploadStart: function (file) { 
 
       var imagePath = file.path; 
 

 
       gm(imagePath).resize(850, 850).quality(70).noProfile().write('public/uploads/spots/850x850/'+file.name, function (err) { 
 
        if (!err) { 
 
         gm(imagePath).resize(150, 150).quality(70).noProfile().write('public/uploads/spots/150x150/'+file.name, function (err) { 
 
          if (!err) { 
 
          } 
 
          else{ 
 
           console.log('Error: '+err); 
 
          } 
 

 
         }); 
 
        } 
 
        else{ 
 
         console.log('Error: '+err); 
 

 
        } 
 

 
       }); 
 

 
      } 
 

 
     })); 
 

 

 

 
\t // Spots Routes 
 
\t app.route('/spots') 
 
\t \t .get(spots.list) 
 
\t \t .post(users.requiresLogin, spots.create); 
 

 
\t app.route('/spots/:spotId') 
 
\t \t .get(spots.read) 
 
\t \t .put(users.requiresLogin, spots.update) 
 
\t \t .delete(users.requiresLogin, spots.hasAuthorization, spots.delete); 
 

 
\t // Finish by binding the Spot middleware 
 
\t app.param('spotId', spots.spotByID); 
 
};

spots.server.controller.js (создать метод)

'use strict'; 
 

 
/** 
 
* Module dependencies. 
 
*/ 
 
var mongoose = require('mongoose'), 
 
\t errorHandler = require('./errors.server.controller.js'), 
 
\t Spot = mongoose.model('Spot'), 
 
\t _ = require('lodash'), 
 
    fs = require('fs'); 
 

 

 

 
/** 
 
* Create a Spot 
 
*/ 
 
exports.create = function(req, res) { 
 
\t var spot = new Spot(JSON.parse(req.body.spot)); 
 
\t spot.user = req.user; 
 

 
    if(req.files.file) 
 
     spot.image=req.files.file.name; 
 
    else 
 
     spot.image='default.jpg'; 
 

 

 
\t spot.save(function(err) { 
 
\t \t if (err) { 
 
      fs.unlinkSync('public/uploads/spots/'+spot.image); 
 
      fs.unlinkSync('public/uploads/spots/850x850/'+spot.image); 
 
      fs.unlinkSync('public/uploads/spots/150x150/'+spot.image); 
 
\t \t \t return res.status(400).send({ 
 
\t \t \t \t message: errorHandler.getErrorMessage(err) 
 
\t \t \t }); 
 
\t \t } else { 
 
      var socketio = req.app.get('socketio'); // tacke out socket instance from the app container 
 
      socketio.sockets.emit('spot.created.'+spot.municipality, {spot:spot, user:req.user}); 
 
      socketio.sockets.emit('spot.created.'+spot.province, {spot:spot, user:req.user}); 
 
      socketio.sockets.emit('spot.created.'+spot.community, {spot:spot, user:req.user}); 
 
      socketio.sockets.emit('spot.created.'+spot.country, {spot:spot, user:req.user}); 
 

 
      res.jsonp(spot); 
 
\t \t } 
 
\t }); 
 

 

 
}; 
 

 

 
/** 
 
* Spot authorization middleware 
 
*/ 
 
exports.hasAuthorization = function(req, res, next) { 
 
\t if (req.spot.user.id !== req.user.id) { 
 
\t \t return res.status(403).send('User is not authorized'); 
 
\t } 
 
\t next(); 
 
};

ответ

3

Решение не использует метод onFileUploadStart и использует функцию с обратным вызовом в контроллере.

маршруты

// Spots Routes 
    app.route('/spots') 
    .get(spots.list) 
    .post(users.requiresLogin,multer({ dest: './public/uploads/spots'}), spots.create); 

Контроллер

exports.create = function(req, res) { 

if (req.files.file) 
    exports.uploadImage(req.files.file,callback); 
else 
    callback(); 


    function callback(){ 
     var spot = new Spot(JSON.parse(req.body.spot)); 
     spot.user = req.user; 

     if (req.files.file) 
      spot.image = req.files.file.name; 
     else 
      spot.image = 'default.jpg'; 


     spot.save(function (err) { 
      if (err) { 
       fs.unlink('public/uploads/spots/850x850/'+spot.image); 
       fs.unlink('public/uploads/spots/150x150/'+spot.image); 
       return res.status(400).send({ 
        message: errorHandler.getErrorMessage(err) 
       }); 
      } else { 
       var socketio = req.app.get('socketio'); // tacke out socket instance from the app container 
       socketio.sockets.emit('spot.created.' + spot.municipality, {spot: spot, user: req.user}); 
       socketio.sockets.emit('spot.created.' + spot.province, {spot: spot, user: req.user}); 
       socketio.sockets.emit('spot.created.' + spot.community, {spot: spot, user: req.user}); 
       socketio.sockets.emit('spot.created.' + spot.country, {spot: spot, user: req.user}); 


       req.spot = spot; 
       Feedback.subscribeSpot(req); 

       Notify.getLocalSubscriptors(spot.municipality,spot.province,spot.community,spot.country,function(subscriptions){ 
        Notify.create(req,null,spot,null,null,null,subscriptions,'spots/'+spot._id,false,'SPOT_CREATED', function(){ 
         res.jsonp(spot); 
        }); 
       }); 
      } 
     }); 
    } 

}; 


exports.uploadImage = function(file, fn){ 
    var imagePath = file.path; 

      gm(imagePath).resize(850, 850).quality(70).noProfile().write('public/uploads/spots/850x850/'+file.name, function (err) { 
       if (!err) { 
        gm(imagePath).resize(150, 150).quality(70).noProfile().write('public/uploads/spots/150x150/'+file.name, function (err) { 
         if (!err) { 
          if(fn)fn(); 
         } 
         else{ 
          console.log('Error: '+err); 
         } 

        }); 
       } 
       else{ 
        console.log('Error: '+err); 

       } 

      }); 

}; 

 Смежные вопросы

  • Нет связанных вопросов^_^