nodejs强大不会触发任何事件

我在express3.x上使用强大的

app.post "/up",(req,res)-> formidable = require('formidable') form = new formidable.IncomingForm() form.uploadDir = __dirname + "/uploads" form.encoding = 'binary' form.addListener 'file',(name,file) -> #write file console.log('file uploaded') return console.log('$$$$$$$$$$$') form.addListener 'end', -> console.log('end') res.end() return console.log('@@@@@$$$$') form.parse req,(err,fields,files)-> console.log('parse') console.log(err) if(err) return console.log('######') return 

和上传表单是

 block content :coffeescript $ -> formData = new FormData() xhr = new XMLHttpRequest() onProgress = (e)-> per_complete = (e.loaded/e.total) * 100 if e.lengthComputable onReady = (e)-> alert("Ready") onError = (err)-> alert("Error Loading "+err) $('#upload').click (e)-> formData.append('img',document.getElementById('img').files[0]) xhr.open('post','/up',true) xhr.addEventListener('error',onError,false) xhr.addEventListener('progress',onProgress,false) xhr.send(formData) xhr.addEventListener('readystatechange',onReady,false) h1 hello world form |select Image: input(type='file',name='img', id='img') input(type='button',value='button', id='upload') 

没有事件被触发…不知道我是什么我的失踪..

如果你使用app.use(express.bodyParser())等价于:

 app.use(express.json()); app.use(express.urlencoded()); app.use(express.multipart()); 

你可以删除app.use(express.multipart()); 那么你可以使用强大的对象。

express在内部使用强大的,所以你的强大不会得到任何事件,如果你想自己使用强大的,你必须从bodyParser中删除multipart/form-data

我仍然在快速2.x,但也应该做的3.x的技巧,在你的app.configure函数尝试

 app.configure(function(){ delete express.bodyParser.parse['multipart/form-data'] }) 

现在你可以使用强大的自己。

是否有一个特定的原因,你为什么使用强大的,而不是内置的bodyParser ? 它使用多部分中间件,基于强大的。 因此大部分来自强大的选项也可以应用到bodyParser。 例如:

 app.use(connect.multipart({ uploadDir: path })); 

要回答你的问题,请尝试下面的代码:

app.js

 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()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); }); app.post("/", function(req, res) { console.log(req.files.img) res.end() }) 

index.jade

 form input(type="file", name="img", id="img") input(type="button", value="button", id="upload") script var formdata = new FormData() var xhr = new XMLHttpRequest() $("#upload").on("click", function(e) { xhr.upload.onprogress = function(evt) { console.log("While sending and loading data.") if (evt.lengthComputable) { console.log (evt.loaded / evt.total * 100); } } xhr.onloadend = function(evt) { console.log("When the request has completed (either in success or failure).") } xhr.onload = function(evt) { console.log("When the request has successfully completed.") } var image = document.getElementById('img').files[0] formdata.append("img", image) xhr.open("POST", "/", true) xhr.send(formdata) }) 

查看更多事件的W3C规范 。

我有一个问题,在我的控制器到达之前,文件已经完全上传了。 事件被解雇了,但我还没有听。 为了制止这个行为,我编写了一个中间件来捕获file upload,并保存在控制器以后访问。

https://gist.github.com/3813103

你可以用它来实现它

 var fileHandler = require('./middleware/fileHandler'); app.use(fileHandler());