无法在Nodejs中执行fileupload程序

我有一个简单的程序,我试图从在线教程在http://www.tutorialspoint.com/nodejs/nodejs_express_framework.htm执行,但我收到一个exception,如下所示:

我对nodejs比较陌生,任何帮助或指导都将非常感激。

使用NodeJS版本:4.1.1。

例外

TypeError: app.use() requires middleware functions at EventEmitter.use (c:\nital\my-data\my-sample-apps\nodejs\tutorialspoint-samples\node_modules\express\lib\application.js:209:11) at Object.<anonymous> (c:\nital\my-data\my-sample-apps\nodejs\tutorialspoint-samples\Sample37.js:11:5) at Module._compile (module.js:434:26) at Object.Module._extensions..js (module.js:452:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Function.Module.runMain (module.js:475:10) at startup (node.js:117:18) at node.js:951:3 

FileUploadDemo.js

 var express = require('express'); var app = express(); var fs = require("fs"); var bodyParser = require('body-parser'); var multer = require('multer'); app.use(express.static('public')); app.use(bodyParser.urlencoded({extended: false})); app.use(multer({dest: 'C:/tmp/'})); app.get('/upload.html', function (req, res) { res.sendFile(__dirname + "/" + "upload.html"); }); //uploading the file here app.post('/file_upload', function (req, res) { console.log(req.files.file.name); console.log(req.files.file.path); console.log(req.files.file.type); var file = __dirname + "/" + req.files.file.name; fs.readFile(req.files.file.path, function (err, data) { fs.writeFile(file, data, function (err) { if (err) { console.log(err); } else { response = { message: 'File uploaded successfully', filename: req.files.file.name }; } console.log(response); res.end(JSON.stringify(response)); }); }); }); var server = app.listen(8081, function () { var host = server.address().address; var port = server.address().port; console.log("Example app listening at http://%s:%s", host, port) }); 

它看起来像一个男人的API已经改变。 由于本教程使用npm install multer --save最新版本,而不是确保版本兼容。 有关如何使用它的详细信息可以在npm页面find。 看来您现在需要将特定的中间件添加到特定的路由中:

 // Remove this line: app.use(multer({dest: 'C:/tmp/'})); // Put this in instead var upload = multer({ dest: 'C:/tmp/' }); // Change this: app.post('/file_upload', function (req, res) { // to app.post('/file_upload', upload.single('file'), function (req, res) { 

虽然你可能仍然可以使用app.use将其添加到所有路由中,但是您肯定需要将其更改为使用upload.single(或者他们select的其他中间件)。

这里是我比较不同于nodejs教程的代码。

server.js

 //20160720 tested! //[dif]:= different from http://www.tutorialspoint.com/nodejs/nodejs_express_framework.htm var express = require('express'); var app = express(); var fs = require("fs"); var bodyParser = require('body-parser'); var multer = require('multer'); app.use(express.static('public')); app.use(bodyParser.urlencoded({ extended: false })); //[dif]app.use(multer({ dest: '/tmp/'})); var upload = multer({ dest: '/tmp/'}); app.get('/index.htm', function (request, response) {response.sendFile( __dirname + "/" + "index.htm" );}) //[dif]app.post('/file_upload', function (request, response) { app.post('/file_upload', upload.single('file'), function (request, response) { /*[dif] console.log(request.files.file.name); console.log(request.files.file.path); console.log(request.files.file.type); var file = __dirname + "/" + request.files.file.name; fs.readFile( request.files.file.path, function (err, data) { [dif]*/ console.log(request.file.originalname); console.log(request.file.path); console.log(request.file.mimetype); //[dif] var file = __dirname + "/" + request.file.name; var file = __dirname + "/" + request.file.originalname; fs.readFile( request.file.path, function (err, data) { fs.writeFile(file, data, function (err) { if( err ){ console.log( err ); }else{ uploadResponse = { message:'File uploaded successfully', //[dif] filename:request.files.file.name filename:request.file.originalname }; } console.log( uploadResponse ); response.end( JSON.stringify( uploadResponse ) ); }); }); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("Example app listening at http://%s:%s", host, port) }) 

如果出现错误 – “Error:ENOENT:no such file or directory,open'C:\ tmp \ ce194372b624b45f2c881140fecad07f'at Error(native)”您应该在根path中创buildtmp文件夹以保存临时文件。 在我的情况下是“c:\ tmp”,“ce194372b624b45f2c881140fecad07f”是临时文件。 file upload成功后应删除。