【问题标题】:Express JS + Multer query database before file uploadExpress JS + Multer 文件上传前查询数据库
【发布时间】:2015-04-08 03:14:29
【问题描述】:

我正在使用 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
});

任何关于我如何实现这一点的想法都将不胜感激。谢谢。

【问题讨论】:

    标签: javascript mysql node.js multer


    【解决方案1】:

    我的快速反应是使用承诺。您可以让您的onFileUploadStart 处理程序创建一个延迟,将其承诺分配给活动请求对象并处理承诺的解决或拒绝。然后在上传路由的主处理程序中,您可以使用 then。

    我相信这基本上是应用于您当前代码的新代码。我注意到我使用的是Q promises library,但还有其他选项(如果您使用它,ES6 也内置了 Promise)。

    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();
    });
    

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 1970-01-01
      • 2020-05-21
      • 2015-03-23
      • 2017-03-01
      • 1970-01-01
      • 2015-11-11
      • 2015-12-31
      • 2018-07-21
      相关资源
      最近更新 更多