2016-06-14 58 views
0

下面的代碼是我的Node.js上傳文件。此代碼工作正常,可以從客戶端上傳任何文件,但上傳後,我無法獲取上傳狀態結果。例如,在Node.js上傳文件後,我無法將上傳結果發送給客戶端。NodeJs簡單的上傳文件不會返回正確的結果

var socket = require('socket.io'); 
var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app); 
var io = socket.listen(server); 
var port = process.env.PORT || 3000; 
var mysql = require('mysql'); 
var multer = require('multer'); 
var connection = mysql.createConnection({ 
    host: 'localhost', 
    user: 'root', 
    password: 'a', 
    database: 'signal' 
}); 

var storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
     callback(null, './uploads'); 
    }, 
    filename: function (req, file, callback) { 
     callback(null, req.params.storeId); 
    } 
}); 
var upload = multer({storage: storage}).single('userPhoto'); 

app.post('/newVitrine/:storeId/:userId', function (req, res) { 
    upload(req, res, function (err) { 
     if (err) { 
      res.send({'result': 0}); 
      console.log({'result': 0}); 
     } else { 
      res.send({'result': 1}); 
      console.log({'result': 1}); 
     } 
    }); 
}); 

server.listen(port, function() { 
    console.log('Server listening at port %d', port); 
}); 

客戶應該得到的JSON對象爲{'result': 1},而是我得到長JSON對象和result不在此。

回答

1

簡短的回答:你無能爲力。你可以使用ajax並假冒它;使它看起來像預期的那樣工作。即使文件上傳服務也能做到這一點 - 比如transloadit。

這個問題實際上是一個非常普遍的問題,如果multer達到一個大小限制超過,發生這種情況(儘管我的情況有點不同),它會中止連接並導致問題;您無法在中止連接時向客戶端發送響應。

檢查這個完美的答案,解釋了很多:

How to cancel HTTP upload from data events?

這裏是工作示例:

var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app); 

var multer = require('multer'); 


var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
     cb(null, './temp') 
    }, 
    filename: function (req, file, cb) { 
     cb(null, file.fieldname + '-' + Date.now()) 
    } 
}); 
var upload = multer({storage: storage}).single('upload'); 

app.get('/', function (req, res) { 

    res.send(`<form action="/upload" enctype="multipart/form-data" id="upld" method="post"> 
     <input type="text" name="title"><br> 
     <input type="file" name="upload" multiple="multiple"><br> 
     <input type="submit" value="Upload" id="upldbtn"> 
     </form>   
     ` 
    ); 
}); 


app.post('/upload', function (req, res) { 
    upload(req, res, function (err) { 
     if (err) { 
      res.send({'result': 0}); 
      console.log(err); 
     } else { 
      res.send({'result': "custom result"}); 
      console.log({'result': 1}); 
     } 
    }); 
}); 

server.listen("9090", function() { 
    console.log('Server listening at port'); 
}); 
+0

我讀的文章,但那不我的問題,我想作爲Android設備發送簡單的json到客戶端 –

+0

因爲在您的路由執行之前,響應已經發送。您正嘗試發送第二個回覆。你應該使用成功事件。 – serkan

+0

我已經用工作代碼更新了我的答案,您的問題可能是上傳字段名稱,您期望「userPhoto」但沒有提供給我們表格,所以我不能準確地說。我將其更改爲「上傳」並更新了代碼,並且工作正常。 – serkan