2016-06-14 55 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