因此,我正在構建一個小應用程序,以瞭解如何使用express.js。我有一個非常簡單的表單,同時提交一個文本字段和一個文件。這是通過FormData提交的,所以我使用後端的Muller來處理請求。我想要做的是對錶單的文本輸入進行驗證,然後在之前對文件採取任何行動(即僅在驗證成功時才存儲,如果不發送某種錯誤消息)。 我用來做它的方式新的express-validator語法:驗證表單通過多次處理器處理
<form id="form" method='POST' enctype='multipart/form-data'>
<input type='file' id='file-upload' name='file-upload' />
<input type='text' id='text-upload' name='text-upload' />
<input type='submit' />
</form>
後端:router.js
//somewhere in the router file
import {importedController} from './controllers/importedController';
/* some other routes */
router.post('/upload', importedController.processfunction);
importedController.js
exports.processfunction = (req, res, next) => {
var getFields = multer().any();
getFields(req, res, err => {
if (err) {return next(err);}
req.checkBody('text-upload','must not be empty!').notEmpty();
//do the validation from here
var errors = req.validationErrors();
if (errors) {
//some logic
} else {
//some other stuff
//in both, i can access req.body and req.file to do whatever i want
}
});
}
但是我注意到,似乎有a new syntax for express validator,所以我試着按照這個語法來做:
個router.js
router.post('/upload', [ body('text-input', 'must be not empty').not().isEmpty()], importedController.processfunction);
但隨後我importedController.js,我定義的函數的multer getFields()以外的驗證不工作(因爲該請求沒有被處理似乎合乎邏輯然而)。但是,如果我嘗試包括它的multer函數內部:
importedController.js
exports.processfunction = (req, res, next) => {
var getFields = multer().any();
getFields(req, res, err => {
if (err) {return next(err);}
errors = validationResult(req);
if (!errors.isEmpty()) {
//actually always yields and error...
} else { //stuff}
});
}
然後,它總是返回一個錯誤,雖然場項正確。就好像驗證是在「未處理」的req上執行的,其中req.body是空的。儘管代碼現在可以工作,所以不用擔心,爲了後續項目的目的,我想遵循新的語法。 任何幫助非常感謝!
編輯:一個解決方案,我發現多虧@ gustavohenke的下面
認識到核心,我的問題是有聯繫的方式multer模塊的作品,因爲它似乎要上傳的文件在處理之前,答案表單數據(必須在驗證之前出現) - 至少multer模塊似乎無法控制它何時上傳文件,使您無法在實際保存之前調用其他中間件。
因此,我最終做的是在客戶端使用ajax首先發送表單數據(將文件保存以備後用),然後鏈接到與表單驗證器邏輯鏈接的multer().any()
中間件中。根據第一次調用服務器的響應,然後將其與另一個ajax鏈接,最後將文件上傳到另一個路由,這次使用multer(storage: myStorage).single('myFileInputName')
來上傳文件。
關於它的思考,這種解決方案似乎也許比我想過起初做的更好:它不僅避免保存在文件中不好的形式輸入的情況下,它甚至避免使用任何帶寬發送的文件(可如果輸入不正確,則體重會很大)。
非常感謝!這是因爲我懷疑然後:)我已經更新了我的帖子與我發現的解決方法,使用兩個不同的路線和ajax上傳表格分爲兩部分。沒有代表'公開'upvote你,但沒有任何反正... –
謝謝,不用擔心!繼續使用express-validator併發布您的反饋:) – gustavohenke