2016-10-17 22 views
-1

それがこの問題に発売されている場合、このコードは正常に動作します:なぜこのコードはミドルウェアとして機能し、機能として機能しませんか?

私が書く場合
app.route('/upload').post(rulesUpload.upload(obj),function (request, response, next) { 
    response.status(200).end('File Caricato/i Con Successo'); 
}); 

ない:

app.route('/upload').post(function(request, response, next) { 
    rulesUpload.upload(obj); 
    response.status(200).end('File Caricato/i Con Successo'); 
}); 


var  formidable  =  require('formidable'), 
        util  =  require('util'), 
        fs    =  require('fs-extra'); 
var defaultMaxSize = 3; 
var defaultMaxFiles = 1; 

exports.upload = function(obj) { 
    return function(req, res, cb) { 
    var check = ''; 
    var errors = {}; 
    for (key in req.files) { 
     if ((obj.required != undefined && req.files[key].size == 0) && (obj.required[key] != undefined && obj.required[key])) 
     check = "Il file " + key + " è obbligatorio!"; 
     else if (obj.destination[key] == undefined) 
     check = 'Il file ' + key + ' non è gestito correttamente.'; 
     else if (obj.files[key] != undefined && obj.files[key] < req.files[key].length) 
     check = 'Non si possono inserire più di ' + obj.files[key] + ' file per il campo ' + key; 
     else if (obj.files[key] == undefined && defaultMaxFiles < req.files[key].length) 
     check = 'Non si possono inserire più di ' + defaultMaxFiles + ' file per il campo ' + key; 
     else {                 
     var  new_location  =  obj.destination[key] + '/'; 
     var numFiles = 1; 
     if (req.files[key].length != undefined) 
      numFiles = req.files[key].length; 
     if (numFiles == 1) 
      req.files[key] = { 
      0: req.files[key] 
      }; 

                  
     for (var  i  =  0;  i  < numFiles;  i++)  {                 
      var  file_name  = ''; 
      if (obj.filename[key] != undefined) { 
      file_name = obj.filename[key].name; 
      if (file_name == undefined) 
       file_name = req.files[key][i].name.substring(0, req.files[key][i].name.lastIndexOf(".")); 
      if (obj.filename[key].prefix != undefined) 
       file_name = obj.filename[key].prefix + file_name; 
      if (obj.filename[key].suffix != undefined) 
       file_name += obj.filename[key].suffix; 
      file_name += req.files[key][i].name.substring(req.files[key][i].name.lastIndexOf('.'), req.files[key][i].name.length); 
      } else file_name = req.files[key][i].name; 
      if (obj.fileTypes[key] != undefined) { 
      var re = new RegExp(obj.fileTypes[key]); 
      var mimetype = re.test(req.files[key][i].type); 
      var extname = re.test(req.files[key][i].name.toLowerCase()); 
      if (!mimetype && !extname) 
       check = "Sono Accettate solo le seguenti estensioni: " + obj.fileTypes[key] + " per il campo " + key; 
      } 
      if (obj.fileSize[key] != undefined && req.files[key][i].size > obj.fileSize[key] * 1024 * 1024) 
      check = 'I file ' + key + ' non possono superare i ' + obj.fileSize[key] + " MB"; 
      if (obj.fileSize[key] == undefined && req.files[key][i].size > defaultMaxSize * 1024 * 1024) 
      check = 'I file ' + key + ' non possono superare di default i ' + defaultMaxSize + " MB"; 
      if (check == '') {                 
      var  temp_path  =  req.files[key][i].path; 

                       
      fs.move(temp_path,  new_location  +  file_name,  function (err)  {                     
       if  (err)  {                    }  
       else  {                    }                 
      }); 
      } else { 
      errors[key] = check; 
      } 
      if (check != "") 
      errors[key] = check; 

     } 
     if (check != "") 
      errors[key] = check; 
     } 
     if (check != "") 
     errors[key] = check; 
     check = '';             
    } 
    if (check != "") 
     errors[key] = check; 
    check = ''; 
    if (errors != {}) 
     return cb(util.inspect(errors)); 
    else return cb(null);         
    }; 
    return; 
}; 

PS:スーパーユーザのために、私はバグがあることを知っています私は解決策を見つけることができず、それは二次的な問題です。

P.S.2:好奇心の高いため、送信されたファイルをアップロードできるかどうかをチェックするためにこのコードを使用します。

+0

それは 'rulesUpload.uploadは(OBJ)(要求、応答、次)になるだろうので、あなたの方法は、関数を返す;' –

答えて

1

rulesUpload.upload(obj, function(){ 
response.status(200).end('File Caricato/i Con Successo'); 
}) 

とにプロトタイプを変更応答、コールバックを返して終了した後、次のミドルウェアに渡します。

アップロード機能が返すもの、その関数を返すもの、つまりミドルウェアを返します。

app.route('/upload').post(middleware1, middleware2, ..., callback) 

コールバックでアップロードを直接処理したい場合は、コールして別の関数を渡す必要があります。

app.route('/upload').post(function (request, response, next) { 
    rulesUpload.upload(obj)(request, response, function(err) { 
     if (!err) { 
      return response.status(200).end('File Caricato/i Con Successo'); 
     } else { 
      // do something with the err.. 
     } 
    }); 
}); 

だから、このコードが複雑になります。..そうミドルウェアを使用)

+0

私はそれがもっと複​​雑だと知っていますが、時には、機能別に!しかし、ありがとう! – Filippo1980

+0

あなたのコードはその応答が未定義であることを返します!どうして? – Filippo1980

+0

あなたは何を意味するかわからないので、とにかくミドルウェアのアプローチを使用する必要があります。上記のコードはテストされていません。nodejとミドルウェアの非同期スタイルのアイデアを提供するだけです。 – webdeb

1

あなたはsynchrone関数としてアップロードを呼び出しますが、fs.moveのために非同期であるためです。さらに、あなたの呼び出しは関数を返します。 ちょうどあなたの関数にコールバックを渡すと、このようにそれを呼び出します、ミドルウェアは要求を取る..あなたはnodejsと非同期コードを記述する必要があるため

exports.upload = function(obj, cb) { 
// return function(req, res, cb) { // REMOVE THIS LINE 
+0

問題があります...アプリはまず最初にreqを見つけられません。その後、モジュール間のreqを追加して、その関数が非関数であることを返します。 – Filippo1980

+0

reqを使用しているのを見たことがない、したがって、exports.upload = function(req、res、obj、cb)でプロトタイプを置き換え、exports.upload(req、res、obj、function())で呼び出す。 しかし、ジョブとは何ですか?定義されていないようです – Dafuck

+0

私はこれを使った新しいユーザーの作成を管理するためにも、データベースへの行の作成後に呼び出す必要があります。 – Filippo1980

関連する問題