Kriss
Kriss

Reputation: 435

express 3.0 bodyParser not working properly

I am using the latest version of express no. 3. I have read the docs and I did exactly as was written but it is still not working as it is supposed to. I get a file in my upload dir after submitting, but then everything stops and the callback function from app.post doesn't fire. The code:

HTML-JADE:

form(action="/upload", method="post", enctype="multipart/form-data")
  input(type="file", name="image")
  input(type='submit', value='submit')

App.js:

var express = require('express')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  , mongo = require('mongodb')
  , Server = mongo.Server
  , Db = mongo.Db
  , routes = require('./routes')
    
var  app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser({uploadDir:'./upload'}));
  app.use(express.methodOverride());
  app.use(express.cookieParser('your secret here'));
  app.use(express.session());
  app.use(app.router);
  app.use(require('stylus').middleware(__dirname + '/public'));
  app.use(express.static(path.join(__dirname, 'public')));
});

app.post('/upload', function(req, res) {
  console.log(req.files.image) // this doesn't fire at all - no matter what i write here 
  res.send(200) //doesn't run also
});

Upvotes: 2

Views: 4062

Answers (3)

Kriss
Kriss

Reputation: 435

Finally I found solution - that was because i used node 0.9.6 -pre. After change to 0.8.21 everything works fine.

Thanks all for your help.

Upvotes: 1

user568109
user568109

Reputation: 48003

Try sending a simple response to the user.

app.post('/upload', function(req, res) {
  console.log(req.files.image);
  res.write('File Uploaded !!');
  res.end();
}

Update

You should try changing the format to

app.post('/upload', function(err,req,res,next){
//Check for errors then handle it
}

Can't tell much until I know what errors you are getting, since file is being uploaded to upload dir bodyParser is working fine. Maybe your route is being handled by another function, or not handled at all. app.router is code that calls the callback .

When you do app.get('/upload', function(req, res) { ... }); it is the router that actually invokes the callback function to process the request. Can you confirm if you can do app.get('/upload',...); the html-jade file succesfully. If not then there is a problem in your routes.

Upvotes: 2

AndyD
AndyD

Reputation: 5385

You need to return a response after reading the data. Without returning a response, express has no idea of when your response is finished and node will not close the connection to the client.

try this:

app.post('/upload', function(req, res) {
  console.log(req.files.image);

  req.on('data', function(raw) {
    console.log('received data');
  });

  req.on('end', function() {
    console.log('end');
    res.send(200);
  });
}

Upvotes: 2

Related Questions