5

現在、モバイル ブラウザーを使用しようとするとハングする画像のアップロードが発生していますが、開発用コンピューターを使用するとハングしません。サーバー内のコードにアクセスできないので、express.bodyParser ミドルウェアが原因であると考えています。ノード0.10.11とエクスプレス3.2.5を使用しています

これは関連するサーバーコードです

// --- Server Setup --- \\  
var server = express();

// all environments
server.set('port', process.env.PORT || 3000);
server.engine('ejs', engine);
server.set('views', __dirname + '/views');
server.set('view engine', 'ejs');
server.use(express.favicon());
server.use(express.logger('dev'));
server.use(express.json())
server.use(express.urlencoded())
server.use(express.methodOverride());
server.use(express.cookieParser('your secret here'));
server.use(express.session());
//Passport stuff
server.use(passport.initialize());
server.use(passport.session());

server.use(express.static(path.join(__dirname, 'public')));
server.use(server.router);

// development only
if ('development' == server.get('env')) {
  server.use(express.errorHandler());
}

// This is the problem route, mw.validateUID just validates the uid and we know that is working 
// where as it seems to stop working at the express.bodyParser
server.post('/photo/:uid', mw.validateUID, express.bodyParser({'keepExtensions': true}), express.limit('2mb'), app.uploadPhoto);

関連する電話番号

RestClient = function() { 
    var xhr = new XMLHttpRequest();

    function init() {
      return {
         postImage: function(path, image, callback) {
           if (image.size > 2500000) {
              callback(-1);
              return;
           }

           var formData = new FormData();               
           formData.append('photo', image);

           xhr.open('POST', path, true);
           xhr.send(formData);
           xhr.onreadystatechange = function() {
             if (this.readyState == this.DONE) {
               callback(this.status);
              } 
           };
         }
       }
}

processImage = function(imageFile) {
  if (user.getId()) {
    restClient.postImage('/photo/' + user.getId(), imageFile, function(status) {
      if (status < 0) {
        alert("Your image must be less than 2.5M in size.");
      } else if (status == 200) {
        reset(true);
        if (!successView) {
          successView = SuccessView();
        }
        successView.show();
      } else {
        alert("Sorry, we're unable to upload your photo.  Please try again later.");
      }                 
    });
  } else {
    alert('login to fb!');
  }
}

編集:

また、これは発生したエラー メッセージです。

Error: Request aborted
    at IncomingMessage.<anonymous> (/home/pinnacle_vodka/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js:107:19)
    at IncomingMessage.EventEmitter.emit (events.js:92:17)
    at abortIncoming (http.js:1881:11)
    at Socket.serverSocketCloseListener (http.js:1893:5)  
    at Socket.EventEmitter.emit (events.js:117:20)
    at TCP.close (net.js:466:12)
4

1 に答える 1

1

問題は Express アプリのミドルウェアにあります。

使用しました:

server.use(express.bodyParser());

JSON、URLEncoded、およびマルチパート リクエストを処理するように Express に指示します。ただし、マルチパート リクエストも処理するノードの Formidable モジュールがあるようです。解決策は、URLEncoded のみを使用してアップロードをフォミダブルで処理するか、フォミダブルを使用せずに bodyparser ですべてを処理することです。

したがって、コードは次のようになります。

a)手ごわいアップロード:

server.use(express.urlencoded());
//server.use(express.methodOverride());
//server.use(express.bodyParser());

または b) エクスプレス マルチパート アップロード:

//server.use(express.urlencoded());
//server.use(express.methodOverride());
server.use(express.bodyParser());

コードのどこかにへの参照がありnode_modules/formidable/lib/incoming_form.js:107:19ます。オプション b を使用する場合は削除してください。

于 2014-01-28T06:10:58.783 に答える