2014-02-21 4 views
0

expressjs와 함께 node-formidable (https://github.com/felixge/node-formidable)을 사용하는 중에 문제가 발생했습니다 : 이제 connect-multipart는 더 이상 사용되지 않습니다 (http://www.senchalabs.org/connect/multipart.html).expressjs와 함께 node-formidable을 사용하는 중 오류가 발생했습니다

업로드 된 파일을 직접 구문 분석하기 위해 node-formidable을 사용하려고하는데 작동하지 못합니다. URL 인코딩 양식이 잘 작동하지만 멀티 파트가 아닙니다. 확실하지는 않지만 연결에서 오는 것 같아요 - 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(); 
}); 

답변

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(); 
    } 

}); 
관련 문제