0

Node.JS + Express.JS + Multer を使用してファイルのアップロードを処理しています。問題は、データベースにクエリを実行して、この名前のファイルが過去にアップロードされたかどうかを確認する必要があることです。アップロードされていない場合は、承認する必要があります。それ以外の場合、ファイルは受け入れられません。onFileUploadStart 関数を使用してこれを機能させようとしています。ただし、データベース クエリは非同期であり、クエリの結果がコールバックに表示されることを考えると、false を返す方法がわかりません。クエリを同期的に実行する方法があれば、私の目標は簡単に達成できます。コードは次のとおりです。

var express = require('express');
var router = express.Router();
var mysql = require('mysql');
var connection = mysql.createConnection({
  //connection details
});

router.post('/upload', multer({
  onFileUploadStart: function(file, req, res) {
    var queryString = "SELECT count(fileName) as count FROM table WHERE fileName = ?;",
      queryInserts = [file.originalname];

    queryString = mysql.format(queryString, queryInserts);

    connection.query(queryString, function(err, rows) {
      if (err) {
        // handle error
      } else {
        if (rows[0].count > 0) {
          // file should not be accepted
        } else {
          // file should be accepted
        }
      }
    });
  },
  dest: "./uploads/"
}), function(req, res) {
  // do other stuff
});

これをどのように達成できるかについてのアイデアは大歓迎です。ありがとう。

4

1 に答える 1

0

私の素早い反応は、promise を使用することです。onFileUploadStartハンドラーに deferred を作成させ、その promise をアクティブなリクエスト オブジェクトに割り当て、promise の解決または拒否を処理することができます。次に、アップロード ルートのメイン ハンドラで then を使用できます。

これは基本的に、現在のコードに適用される新しいコードになると思います。Q promises ライブラリを使用していることに注意してください。ただし、他のオプションもあります (使用している場合、promise は ES6 にも組み込まれています)。

var express = require('express');
var router = express.Router();
var mysql = require('mysql');
var Q = requires('q');
var connection = mysql.createConnection({
  //connection details
});

router.post('/upload', multer({
  onFileUploadStart: function(file, req, res) {
    var deferred = Q.defer();
    req.fileUploadPromise = deferred.promise;
    var queryString = "SELECT count(fileName) as count FROM table WHERE fileName = ?;",
      queryInserts = [file.originalname];

    queryString = mysql.format(queryString, queryInserts);

    connection.query(queryString, function(err, rows) {
      if (err) {
        // handle error
        deferred.reject('You had an error...');
      } else {
        if (rows[0].count > 0) {
          // file should not be accepted
          deferred.reject('You had a duplicate file');
        } else {
          deferred.resolve(file); // ?? or something useful
          // file should be accepted
        }
      }
    });
  },
  dest: "./uploads/"
}), function(req, res) {

  req.fileUploadPromise
  .then(function(successResult){
       // do other stuff         
     res.status(200).send('success');
  })
  .catch(function(errorResult){
     // read the error result to provide correct code & error message for user
  })
 .done();
});
于 2015-04-07T19:14:29.033 に答える