Я новичок в 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();
};