Экспресс 4: Как отправить объект JSON для просмотра?
Я исследовал последние несколько дней, и я не могу понять это.
Цель: пользователь загружает текстовый файл с помощью формы отправки угловых файлов, а мультитер сохраняет файл во временную папку. Затем данные отправляются, и пользователь может видеть метаданные и содержимое файла либо на той же странице, либо на перенаправленной странице.
Проблема: в моем маршруте POST я могу console.log(req.file), и он показывает метаданные файла. Файл сохраняется во временную папку.
Я попытался res.send(req.file), res.json(req.file), данные, связывающие метаданные в области видимости контроллера, res.locals, функции промежуточного программного обеспечения и многие другие вещи, которые я даже не могу вспомнить, Объект json никогда не доходит до вида.
Вот фрагмент того, с чем я работаю.
routes.js
var express = require('express');
var app = express();
var router = express.Router();
router.get('/test', function(req, res, next){
res.render('test', {title: 'Test'});
});
router.post('/test', function(req, res, next){
console.log(req.file);
res.json(req.file);
});
module.exports = router;
app.js
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var logger = require('morgan');
var sys = require('sys');
var multer = require('multer');
var app = express();
// Local Files
var routes = require('./routes/index');
var users = require('./routes/users');
var favicon = require('serve-favicon');
// console.log(__dirname + '/public/scripts/test.py');
// Create multer object for file uploads
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './tmp/')
}
// filename: function (req, file, cb) {
// cb(null, file.originalname + "%" + Date.now())
// }
});
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// app.use(express.bodyParser( { keepExtensions: true, uploadDir: __dirname + '/photos' } ));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'bower_components')));
app.use(multer({ storage: storage }).single('file'));
app.use('/', routes);
app.use('/users', users);
controller.js
var t = angular.module('upload', ['ngFileUpload']);
t.controller('ctrl', ['$scope', 'Upload', '$timeout', function ($scope, Upload, $timeout) {
$scope.f = '';
$scope.uploadFiles = function(file) {
$scope.f = file;
console.log(file);
if (file && !file.$error) {
file.upload = Upload.upload({
url: '/test',
file: file
});
file.upload.then(function (response) {
$timeout(function () {
file.result = response.data;
});
}, function (response) {
if (response.status > 0)
$scope.errorMsg = response.status + ': ' + response.data;
});
file.upload.progress(function (evt) {
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
}
}]);
req.file
{ fieldname: 'file',
originalname: 'lorem.rtf',
encoding: '7bit',
mimetype: 'text/rtf',
destination: './tmp/',
filename: '0b9d25cc663a05628059bd56a0aef4bc',
path: 'tmp/0b9d25cc663a05628059bd56a0aef4bc',
size: 815 }
2 ответа
Я не знаю точно, почему это работает против того, что я делал. (Мне кажется, что я пробовал много вариантов одного и того же) Я пристально следил за документами angular-file-upload и могу установить для объекта ответа переменную области видимости.
Единственное заметное отличие состоит в том, что я не установил функцию Upload для переменной и не вызвал действия над ней. Вместо этого все события связаны как единое целое.
route.js и app.js остались прежними.
новая функция controller.js
$scope.upload = function (file) {
Upload.upload({
url: '/test',
data: {file: file}
}).then(function (resp) {
console.log('Success ' + resp.config.data.file.name + ' uploaded. Response: ' + resp.data);
console.log(resp.data);
$scope.obj = resp.data;
}, function (resp) {
console.log('Error status: ' + resp.status);
}, function (evt) {
var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
});
};
Вы всегда можете попробовать JSON.stringify
сериализовать это. Посмотрите, если это делает req.file
должным образом. Вы все еще можете установить заголовок text/json
вручную.