【问题标题】:Express 4: How do I send JSON object to view?Express 4:如何发送 JSON 对象来查看?
【发布时间】:2015-12-30 02:43:22
【问题描述】:

过去几天我一直在研究,但我无法弄清楚这一点。

目标:用户使用 angular-file-upload 表单上传文本文件,然后 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 }

【问题讨论】:

    标签: angularjs node.js express multer angular-file-upload


    【解决方案1】:

    我不确切知道为什么这与我正在做的事情相比有效。 (我觉得我尝试了同一件事的许多变体)我密切关注 angular-file-upload 文档,并且能够将响应对象设置为范围变量。

    唯一明显的区别是我没有将 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);
      });
    };
    

    【讨论】:

      【解决方案2】:

      您可以随时尝试JSON.stringify 对其进行序列化。看看是否正确呈现req.file。您仍然可以手动将标头设置为text/json

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 2019-03-29
        • 2017-08-03
        相关资源
        最近更新 更多