Express 500 TypeError:无法读取undefined的属性“image”

时间:2014-02-02 06:50:21

标签: javascript node.js express

我正在尝试使用Express NodeJS框架上传图像文件,但它不断抛出此错误:

Express
500 TypeError: Cannot read property 'image' of undefined

这是我的app.js

var express = require('express');
var routes = require('./routes');
var uploads = require('./routes/uploads');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.bodyParser());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.post('/uploads', uploads.uploads);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

这是upload.js

var fs = require("fs");

exports.uploads = function(req, res){
  //console.log(req.files);
  fs.readFile(req.files.image.path, function (err, data) {

    console.log("Request handler upload was called");
    var imageName = req.files.image.name;
    console.log(imageName);

    if(!imageName){

        console.log("There was an error")
        res.redirect("/");
        res.end();

    } else {

      var newPath = __dirname + "/uploads/" + imageName;


      fs.writeFile(newPath, data, function (err) {


        res.redirect("/uploads/" + imageName);

      });
    }
});
}

我在类似的问题上尝试了其他答案,包括使用bodyParser()函数并将输入标记的名称参数设置为我的 index.jade

还有其他可能的解决方案吗?

3 个答案:

答案 0 :(得分:2)

我想到了两件事:

  • 您是否已检查过您对#34; / uploads /"?
  • 的书面权限
  • 检查index.jade - 在同一页面上有两个表单是一个确定的麻烦迹象。有些情况下,同一页面上需要多个表单,但我很漂亮 确保他们在一个简单的应用程序中没有业务要做。这很可能是您的浏览器使用错误参数发出请求的原因。您还可以使用Chrome Inspector / Firebug监视浏览器,检查浏览器是否确实发送了错误的参数。

如果以上都不能帮助您,请查看您是否可以修改此要点https://gist.github.com/bogdanbiv/eec255655c5aca8ae2de以使其与您的用例类似。它现在不起作用,因为我不知道在索引模块中放什么 - require(' ./ index');

请注意,要点不允许创建文件夹。我知道将服务器代码放在与上传文件夹相同的文件夹中是一个安全噩梦,但它仅用于调试目的。

答案 1 :(得分:0)

我刚遇到这个问题,如果查看日志,则不推荐使用bodyParser()。

https://github.com/senchalabs/connect/wiki/Connect-3.0

他们列出了几个要使用的中间件。我修改为使用" busboy"它现在工作正常。

回购中有一些例子 https://github.com/mscdex/busboy

答案 2 :(得分:0)

您可以像这样重定向用户:

res.redirect('/images/' + req.file.filename);

对象文件包含:

{ fieldname: 'image',
  originalname: 'Final copy.png',
  encoding: '7bit',
  mimetype: 'image/png',
  destination: './public/upload/temp',
  filename: 'image-1460839230171',
  path: 'public/upload/temp/image-1460839230171',
  size: 8441
}