【问题标题】:Not able to execute a fileupload program in Nodejs无法在 Node Js 中执行文件上传程序
【发布时间】:2015-10-07 17:42:52
【问题描述】:

我有一个简单的程序,我正试图从http://www.tutorialspoint.com/nodejs/nodejs_express_framework.htm 的在线教程中执行,但我遇到了如下异常:

我对 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)
});

【问题讨论】:

    标签: javascript node.js single-page-application


    【解决方案1】:

    multer的api好像变了。由于本教程使用npm install multer --save,因此它会引入最新版本,而不是确保您拥有的版本兼容。有关如何使用它的详细信息,请参阅npm page。看来您现在需要将所需的特定中间件添加到特定路由中:

    // 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(或他们选择的其他中间件)。

    【讨论】:

      【解决方案2】:

      这是我比较与 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)
      })
      

      如果您收到错误 - “错误:ENOENT:没有这样的文件或目录,请打开 'C:\tmp\ce194372b624b45f2c881140fecad07f' 在错误(本机)“ 您应该在根路径中创建 tmp 文件夹以保存临时文件。 在我的例子中是“c:\tmp”,而“ce194372b624b45f2c881140fecad07f”是临时文件。您应该在文件上传成功后将其删除。

      【讨论】:

      • 只是为了清楚最初的问题是“app.use(multer({ dest: '/tmp/'}))”行,并且您还提供了所有剩余的更改以使代码正常工作对吧?
      猜你喜欢
      • 2017-10-10
      • 2020-11-29
      • 2021-07-19
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 2017-04-22
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多