2017-09-05 36 views
1

因此,我正在構建一個小應用程序,以瞭解如何使用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')來上傳文件。

關於它的思考,這種解決方案似乎也許比我想過起初做的更好:它不僅避免保存在文件中不好的形式輸入的情況下,它甚至避免使用任何帶寬發送的文件(可如果輸入不正確,則體重會很大)。

回答

0

當你說驗證發生在之前身體被分手處理時,你是對的。

在這兩種情況下,驗證器都會盡快運行;但請注意以下幾點區別:

  • 在你給的遺留API的例子,您定義的驗證的multer回調,身體被處理後。因此,它的工作原理。
  • 但是,在您的檢查API示例中,驗證者在之前被定義爲,因此您總會遇到錯誤 - req.body仍爲空。
+1

非常感謝!這是因爲我懷疑然後:)我已經更新了我的帖子與我發現的解決方法,使用兩個不同的路線和ajax上傳表格分爲兩部分。沒有代表'公開'upvote你,但沒有任何反正... –

+0

謝謝,不用擔心!繼續使用express-validator併發布您的反饋:) – gustavohenke