NodeJs简单上传文件不会返回正确的结果

时间:2016-06-14 19:22:46

标签: javascript node.js

下面的代码是我的Node.js上传文件。此代码工作正常,可以从客户端上传任何文件,但上传后,我无法获得上传状态结果。例如在Node.js上,上传文件后,我无法将上传结果发送给客户端。

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 个答案:

答案 0 :(得分: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');
});