2015-10-01 7 views
1

Я исследовал последние несколько дней, и я не могу понять этого.Экспресс 4: Как отправить объект JSON для просмотра?

Цель: Пользователь загружает текстовый файл, используя форму загрузки углового файла, и multer сохраняет файл во временную папку. Затем данные POST и пользователь могут видеть метаданные и содержимое файла либо на одной странице, либо на перенаправленной странице.

Проблема: на моем маршруте 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 } 

ответ

0

Вы всегда можете попробовать JSON.stringify сериализовать его. Посмотрите, правильно ли отображает req.file. Вы все равно можете установить заголовок на text/json вручную.

0

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

Единственное заметное различие заключается в том, что я не устанавливал функцию Upload в переменную и не вызывал действия над переменной. Вместо этого все события нанизаны как единое целое.

routes.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); 
    }); 
};