Node.js nodejs不会触发任何事件
我在express3.x上使用强大的Node.js nodejs不会触发任何事件,node.js,express,formidable,Node.js,Express,Formidable,我在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
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')
没有任何事件被触发…不确定我遗漏了什么。您使用强大而不是内置的有什么具体原因吗?它使用中间件,基于强大的。因此,中的大多数选项也可以应用于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()
})
翡翠索引
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)
})
查看查看以获取更多事件。express在内部使用Knowledge,因此您的Knowledge不会获得任何事件,如果您想自己使用Knowledge,则必须从bodyParser中删除
多部分/表单数据
我仍在使用express 2.x,但在你的应用程序中,3.x上也应该有同样的功能
app.configure(function(){
delete express.bodyParser.parse['multipart/form-data']
})
现在您可以自己使用“强大”了。我也遇到过同样的问题,在我的控制器处理文件之前,该文件已完全上传。事件被触发了,但我还没在听。
为了解决这个问题,我编写了一个中间件来捕获上传的文件,并将它们保留下来供控制器稍后访问
您可以使用
var fileHandler = require('./middleware/fileHandler');
app.use(fileHandler());
如果使用app.use(express.bodyParser())
相当于:
app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());
您可以删除app.use(express.multipart())代码>然后您可以使用强大的对象。今天也发生了类似的问题。
浪费了4个多小时的时间。
我在这里期待答案,但我在这里找不到,所以写下来
问题
1. formidable - fileBegin event is fired
2. formidable - file event is fired - for small ~3MB/~4MB files
3. formidable - file event is not fired - for large files
on local machine - nodejs/libraries will work fine
on remote machine - behind nginx it above issue happens
使用的库:
-微——编程模式过于简单的罪魁祸首
-强大--较小的罪魁祸首没有给出异步/等待的示例
解决方案
1. increase the VM memory size 2/3 times the file upload size (libraries eat a lot of memory)
2. increase both proxy & http timeout/ size in the nginx to the required
- example, 10 mins timeout & 2G size
3. change the programming model for large files
a. on local machine - nodejs/libraries will work fine
b. but behind the nginx proxy, it optimizes and kills the on going process asap
to solve this proxy issue, use more promises/ async-awaits, delay the reply to nginx
希望对您有所帮助。Nodejs/Express设置
// https://www.npmjs.com/package/express-formidable
npm install express-formidable
快速演示
const express = require('express');
const formidableMiddleware = require('express-formidable');
const app = express();
// Express-Formidable attaches your multi-part form to the request object
app.use('/formdata/with-fields-and-files', formidableMiddleware(), (req, res) => {
console.log(req.fields, 'fields')
console.log(req.files, 'files')
}
app.listen(3000)