すでにデータベースにエントリが追加されている場合、Multerがファイルをアップロードするのを防ぐ方法を理解しようとしています。マルチパートフォームのデータを解析して、Multer(ノードモジュール)を使ってファイルをアップロードします。
私のシナリオでは、IDを指定してビールを追加できるマルチパートフォームがあります。 2つの入力があり、1つはテキスト入力(id)ともう1つはファイル入力(beerImage)です。
私がしたいのは、ファイルをアップロードする前に、それがデータベースにすでに存在するかどうかをチェックし、そうでなければファイルをアップロードすることです。現在、私のコードはファイルを最初にアップロードし、それが存在するかどうかをチェックしています。それは悪いことです!
私のコードです:
var express = require('express');
var router = express.Router();
var multer = require('multer');
var database = require('../services/database');
var upload = multer({ dest: 'uploads/' });
var cpUpload = upload.fields([{ name: 'beerImage', maxCount: 1 } ]);
router.route('/beers')
.post(function (req, res, next) {
// I'd like to use req.body.id in the query here, but it doesn't exist yet!
cpUpload(req, res, function (err) {
if (err) {
return next(new Error('Error uploading file: ' + err.message + ' (' + err.field + ')'));
} else {
database.getConnection().done(function (conn) {
conn.query('SELECT COUNT(*) AS beersCount FROM beers WHERE id=?', req.body.id, function (err, rows, fields) {
if (err) {
conn.release();
return next(err);
}
if (rows[0].beersCount > 0) {
conn.release();
return next(new Error('Beer "' + req.body.id + '" already exists!'));
} else {
delete req.body.beerImage;
conn.query('INSERT INTO beers SET ?', req.body, function (err, rows, fields) {
conn.release();
if (err) {
return next(err);
}
res.json({ message: 'Beer "' + req.body.id + '" added!' });
});
}
});
});
}
});
});
module.exports = router;
私が最初にクエリを実行し、それがreq.body.idを使用して存在しているかどうかを確認できるようにする(マルチパートフォームデータを「解析」への道を見つけることができません)ファイルをアップロードするかどうかを決定します。それは "cpUpload"は両方のことを同時に行うようです!
「req.body.id」を最初に取得して(質問を実行する)どのようにファイルをアップロードするかを決める考え方はありますか?
これは唯一の解決策ですか、一時ファイルを作成しますか? – Emi
これはユーザーのためのセキュリティです。クライアント側のファイルにアクセスすることはできません。 – Martial
Node.jsはサーバ上で動作し、保存する前にそのエントリが存在するかどうか確認したいところです。 – Emi