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

标签 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);
});

客户端应该以 {'result': 1} 形式获取 json 对象,但我得到的是长 json 对象,而 result 不在其中。

最佳答案

简短回答:您无能为力。你可以使用 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');
});

关于javascript - NodeJs 简单上传文件不返回正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37820465/

相关文章:

Javascript:在方法内部调用方法本身(使用原始参数)

javascript - 使用 NodeJS 和 Socket.io 的 CPU 密集型任务架构

javascript - 在提交之前获取 HTML 页面中最后输入的行的逻辑

JavaScript代码在代码运行时不会执行,但是当我调试它并在控制台中执行时,它可以工作

javascript - 接口(interface)中TypeScript函数声明的区别

javascript - 在 angularjs 中使菜单项处于事件状态 onclick

javascript - 我的 Protractor 脚本错误 - 需要对象

node.js - Google App Engine 的安全 Cron 作业无法启动 (Node js)

javascript - 如何安全地评估用户输入表达式

node.js - 使用express框架和node.js时运行时出现java.lang.NoClassDefFoundError