Javascript 文件上传前Express JS+Multer查询数据库
我使用Node.JS+Express.JS+Multer来处理文件上传。问题是,我需要查询数据库,以查看过去是否上载过具有此名称的文件。如果尚未上传,则应接受。否则,不应接受该文件。我正试图使用onFileUploadStart函数实现这一点;但是,数据库查询是异步的,如果查询结果出现在回调中,我看不到返回false的方法。如果有一种同步执行查询的方法,我的目标将很容易实现。代码如下:Javascript 文件上传前Express JS+Multer查询数据库,javascript,mysql,node.js,multer,Javascript,Mysql,Node.js,Multer,我使用Node.JS+Express.JS+Multer来处理文件上传。问题是,我需要查询数据库,以查看过去是否上载过具有此名称的文件。如果尚未上传,则应接受。否则,不应接受该文件。我正试图使用onFileUploadStart函数实现这一点;但是,数据库查询是异步的,如果查询结果出现在回调中,我看不到返回false的方法。如果有一种同步执行查询的方法,我的目标将很容易实现。代码如下: var express = require('express'); var router = express.
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
});
我将非常感激任何关于如何实现这一目标的想法。谢谢。我的快速反应是使用承诺。您可以让onFileUploadStart处理程序创建一个延迟请求,将其承诺分配给活动请求对象,并处理承诺的解决或拒绝。然后在上载路由的主处理程序中,您可以使用Then 我相信这基本上就是应用于您当前代码的新代码。我注意到我正在使用,但如果您正在使用,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();
});