在Krakenjs应用程序中,file upload与Multer挂起

我在Nodejs Kraken应用程序中使用Muller(^ 0.1.6)来上传文件。 我查看了npm上的multer文档,看起来使用这个模块进行file upload非常简单。

但是我一直在上传本地机器上的文件时遇到问题。 有趣的是,我注意到文件被上传,但是我的服务器挂起,并且控件永远不会到负责呈现下一页的应用程序中的下一个中间件。

我也注意到,当服务器挂起时,它试图再次上传文件,最后超时说“没有数据收到”。 由于试验员的重试,我看到上传了同一文件的两个副本。

这是我使用multer模块的kraken应用程序代码:

index.js(与package.json相同级别的root级别index.js)

... ..... app = module.exports = express(); app.use(kraken(options)); app = module.exports = express(); app.use(kraken(options)); app.on('start', function () { console.log('Application ready to serve requests.'); console.log('Environment: %s', app.kraken.get('env:env')); }); app.use(multer({ dest: '/Users/abc/temp/fileuploads', limits: { fieldNameSize: 500, files: 2, fields: 5 }, rename: function (fieldname, filename) { return fieldname + filename + Date.now(); }, onFileUploadStart: function (file) { console.log('Upload starting for filename: ' + file.originalname); }, onFileUploadData: function (file, data) { console.log(data.length + ' of ' + file.fieldname + ' arrived') }, onParseStart: function () { console.log('Form parsing started at: ', new Date()) }, onParseEnd: function (req, next) { console.log('Form parsing completed at: ', new Date()); next(); }, onFileUploadComplete: function (file) { console.log(file.fieldname + ' uploaded to ' + file.path); }, onFileSizeLimit: function (file) { console.log('Failed: ', file.originalname) fs.unlink('./' + file.path) // delete the partially written file }, onFilesLimit: function () { console.log('Crossed file limit!') }, onFieldsLimit: function () { console.log('Crossed fields limit!') }, onPartsLimit: function () { console.log('Crossed parts limit!') }, onError: function(error, next) { console.log("Error occurred while uploading the file!!"); next(error); } })); index.js (under controllers directory of Kraken application) ------------------------------------------------------------- router.post('/upload', function (req, res) { console.log("File Uploaded"); model.status = "File Uploaded!!"; var body = req.body; console.log("File attributes: " + JSON.stringify(body)); var files = req.files; console.log("Files: " + JSON.stringify(files)); res.render('uploadfile/datauploadform', model); }); 

下面是我开始上传文件后的应用程序日志(注意,在超时之前,multer试图上传两个相同的文件):

Form parsing started at: Sat Jan 10 2015 01:29:45 GMT-0800 (PST) Upload starting for filename: HelloNashorn.js 35 of file arrived file uploaded to /Users/abc/temp/fileuploads/fileHelloNashorn1420882185450.js Form parsing completed at: Sat Jan 10 2015 01:29:45 GMT-0800 (PST)

Form parsing started at: Sat Jan 10 2015 01:31:45 GMT-0800 (PST) Upload starting for filename: HelloNashorn.js 35 of file arrived file uploaded to /Users/abc/temp/fileuploads/fileHelloNashorn1420882305450.js Form parsing completed at: Sat Jan 10 2015 01:31:45 GMT-0800 (PST)

感谢任何帮助!

Kraken使用meddleware来处理任何需要加载的中间件。 这可能是因为您正在手动添加multer middware的问题的一部分。 但是,您是否在使用Mulder,因为您需要某些function,或者您只是想要上传一个文件? 如果是后者,你可以忘记垂涎,只要做到以下几点。

在你的html页面中,执行这个操作(假设你正在为你的模板使用dustjs ):

 <form method="POST" action="/upload" enctype="multipart/form-data"> <input type="file" name="myfile" /> <input type="hidden" name="_csrf" value="{_csrf}" /> <input type="submit" /> </form> 

然后在你的控制器中这样做:

 router.post('/upload', function (req, res) { fs.rename(req.files['myfile'].path, './' + req.files['myfile'].name, function(err) { res.render('index', model); }); }); 

上面的代码只会将该文件转储到根目录应用程序目录中,这是您不想要的,所以根据需要进行调整。

最后,我能够让Multer工作,并且能够上传文件而无需挂起我的应用程序。 我想使用multer的原因是因为它提供了一组丰富的事件,可以让您更好地控制file upload。

这就是我要让Multer和Kraken合作的原因。 由于Kraken通过一个名为meddleware的模块注册了它的中间件,所以我必须在Kraken应用的config / config.json文件中注册Multer作为meddleware。 在configurationMulter的同时,我必须确保Multer的优先级低于Router的优先级,以便我的Multer中间件可以在路由器注册之前注册。

Multer提供了一个名为onParseEnd的事件,它在表单parsing完成时被触发。 根据关于npm的Multer文档,请确保在您的监听器中调用next(),否则您的请求将被挂起。

我与Multer和Kraken上传文件的源代码在这里: https : //github.com/prabhash1785/NodeJS/tree/master/KrakenApps/fileuploadwithmulter

其他注意事项:

  • 如果你只是想上传一个文件而不用担心Multer事件的function,那么你不必使用Multer。 Express / Kraken内置支持file upload(multipart / form-data)。 上传的文件可以通过使用req.files在控制器中访问[file_name] .path [其中,file_name是您的模板中定义的文件的名称]

  • 其次,如果要将file upload/ sftp到远程存储服务器(服务器不是部署Node应用程序的位置),则可以考虑使用节点模块(如ssh2 / sftp-upload / scp2)。 我有几个代码示例file upload/ sftp使用这些模块在这里: https : //github.com/prabhash1785/NodeJS/tree/master/fileupload