403使用node-formidable和expressjs时出错

时间:2014-02-21 18:55:14

标签: express

我在使用node-formidable(https://github.com/felixge/node-formidable)和expressjs时遇到了问题:现在不推荐使用connect-multipart(http://www.senchalabs.org/connect/multipart.html)。

我正在尝试使用node-formidable直接解析我上传的文件,但无法使其正常工作。 Urlencoded表单运行良好但不是多部分。我不确定,但我认为它来自connect-csrf:

更新:删除csrf中间件时效果很好。

Error: Forbidden
    at Object.exports.error (/srv/www/mysite.com/nodejs/myapp/node_modules/express/node_modules/connect/lib/utils.js:63:13)
    at createToken (/srv/www/mysite.com/nodejs/myapp/node_modules/express/node_modules/connect/lib/middleware/csrf.js:82:55)
    at Object.handle (/srv/www/mysite.com/nodejs/myapp/node_modules/express/node_modules/connect/lib/middleware/csrf.js:48:24)
    at next (/srv/www/mysite.com/nodejs/myapp/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at next (/srv/www/mysite.com/nodejs/myapp/node_modules/express/node_modules/connect/lib/middleware/session.js:315:9)
    at /srv/www/mysite.com/nodejs/myapp/node_modules/express/node_modules/connect/lib/middleware/session.js:339:9
    at /srv/www/mysite.com/nodejs/myapp/node_modules/connect-redis/lib/connect-redis.js:101:14
    at try_callback (/srv/www/mysite.com/nodejs/myapp/node_modules/connect-redis/node_modules/redis/index.js:581:9)
    at RedisClient.return_reply (/srv/www/mysite.com/nodejs/myapp/node_modules/connect-redis/node_modules/redis/index.js:671:13)
    at ReplyParser.<anonymous> (/srv/www/mysite.com/nodejs/myapp/node_modules/connect-redis/node_modules/redis/index.js:313:14)

我该怎么办?这是我的代码:

// Body parser
app.use(express.urlencoded());

app.use(function(req, res, next) {

  if (req.is('multipart/form-data') && req.method == "POST") {

    var form = new formidable.IncomingForm();

    form.uploadDir = "mytmpfolder";

    form.parse(req, function(err, fields, files) {
      req.files = files;
    });

  }

  next();

});

// Cookie parser
app.use(express.cookieParser());

// Session
app.use(express.session({
  key: 'secure_session',
  store: new redisStore,
  secret: 'secret',
  proxy: true,
  cookie: {
    secure: true,
    maxAge: null
  }
}));

// CSRF
app.use(express.csrf());
app.use(function(req, res, next){
  res.locals.token = req.csrfToken();
  next();
});

1 个答案:

答案 0 :(得分:0)

我找到了一种最终使其有效的方法:

// Body parser
app.use(function(req, res, next) {

  if (req.method == "POST") {

    var form = new formidable.IncomingForm();

    var fieldsObj = {};
    var filesObj = {};

    form.uploadDir = "/srv/www/mysite.com/nodejs/myapp/static/uploads";

    form.on('field', function(field, value) {
      fieldsObj[field] = value;
    });

    form.on('file', function(field, file) {
      filesObj[field] = file;
    });

    form.on('end', function() {
      req.body = fieldsObj;
      req.files = filesObj;
      next();
    });

    form.parse(req);

  }
  else {
    next();
  }

});