2015-10-07 2 views
2

У меня есть простая программа, что я пытаюсь выполнить из онлайн учебник по http://www.tutorialspoint.com/nodejs/nodejs_express_framework.htm, но я получаю исключение следующим образом:не в состоянии выполнить программу FileUpload в Nodejs

Я относительно новым для 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) 
}); 

ответ

2

Похоже апи из multer изменилось. Поскольку в учебнике используется 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 (или другой по их выбору посредников).

+0

Это сработало :) Спасибо !!! – user2325154

0

Вот код, который я сравниваю с учебником 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» - это временный файл. вы должны удалить его после успешной загрузки файла.

+0

только для того, чтобы быть понятным, оригинальная проблема заключалась в том, что «app.use (multer ({dest: '/ tmp /'})), и вы также предоставили все остальные изменения, чтобы заставить код работать, правильно? – Sombriks