1. 程式人生 > 實用技巧 >node中接收處理表單資料的好方法--formidable

node中接收處理表單資料的好方法--formidable

  說起前端,我們除了會說起html,css,JavaScript等,還有一項必備的技能就是node,雖然node並非是現在開發潮流中很火爆的工具,但是由於node中是使用JavaScript進行編寫,對前端還是非常友好的。雖然並未在很多地方使用,但是仍是有非常多的大廠或者相對單一的公司會用到node進行開發,這就不得用到node進行搭建中介軟體或者一系列的node服務。而作為前端,鮮少與資料進行交道的我們,無論是編寫還是處理上都是有相對不足的地方,因此,本篇文章將會介紹node中非常好用的一個依賴,能夠快速的幫你接受以及處理表單資料的方法,他就是formidable。

  簡介

  單獨看formidable,很多人可能不知道是用來幹嘛,但是如果你去拆分單詞來看form,就是我們前端中常常見到的表單標籤,因此formidable就是用於表單的處理。

  實際運用

  場景一

  最常用的場景就是接受引數,由於請求會伴隨著很多的一些額外我們不需要用到請求引數,node也不例外,我們通過被訪問接收到req(請求)是很難查詢到引數在哪的,如圖:

  看,是不是隻是看到一堆資料,無從下手。但是如果使用了formidable的轉換之後,我們就很簡單的能夠拿到引數。

const formidable = require('formidable');
const form = formidable();
form.parse(req, (err, fields, files) => {});

  formidable會通過parse()方法對req進行處理,處理完之後會回撥fields引數回來,這裡就是我們所需要的頁面請求的引數。

  當然formidable有一個非常好的好處就是,無論你是GET還是POST方法都是可以進行轉換來統一獲取到對應的請求引數的。

  場景二

  檔案上傳也是我們在服務端,或者中介軟體很常使用到的。其實,相對檔案的接受其實也是通過場景一中的fields,在fileds中我們也是可以獲取到對應的檔案資訊,如標題(title)等資訊。但是,只是獲取檔案並不是檔案上傳,我們還要放到我們對應的伺服器上,進行儲存才是真正的上傳,因此我們還是需要用到formidable,那麼接下就來介紹檔案上傳所需要用到formidable裡面的方法以及屬性。

  form.uploadDir

  form.uploadDir='path',設定上傳檔案存放的資料夾,預設為系統的臨時資料夾

  form.maxFieldsSize

  form.maxFieldsSize = 10 * 1024 * 1024; 限制所有儲存表單欄位域的大小(除去file欄位),如果超出,則會觸發error事件,預設為2M

  formidable.File物件

  file.size:獲取檔案上傳的大小,假如檔案正在上傳,file.size則表示已經上傳的檔案大小。

  file.path:上傳檔案的路徑,如果不想上傳到預設檔案路徑,通過上述的form.uploadDir進行設定檔案路徑,或者通過fileBegin進行設定。

  file.name:上傳檔名稱

  等等......

  form.on(method,callback)方法

  上傳檔案的一些監聽。例如method中的。

  form.on('progress', function(bytesReceived, bytesExpected) {}); 當有資料塊被處理完之後,就會觸發回撥,因此能夠很好的監聽到完成到什麼步驟,也可以進行進度條的把控。bytesReceived:伺服器已經接收到當前表單資料多少位元組;bytesExpected:將要接收到當前表單所有資料的大小

  form.on('field', function(name, value) {}); 每當一個欄位/值對已經收到時會觸發該事件

  form.on('fileBegin', function(name, file) {}); 在post流中檢測到任意一個新的檔案便會觸發該事件

  form.on('file', function(name, file) {}); 每當有一對欄位/檔案已經接收到,便會觸發該事件

  form.on('error', function(err) {}); 當上傳流中出現錯誤便會觸發該事件,當出現錯誤時,若想要繼續觸發request的data事件,則必須手動呼叫request.resume()方法

  form.on('aborted', function() {}); 當用戶中止請求時會觸發該事件,socket中的timeout和close事件也會觸發該事件,當該事件觸發之後,error事件也會觸發

  form.on('end', function() {}); 當所有的請求已經接收到,並且所有的檔案都已上傳到伺服器中,該事件會觸發。此時可以傳送請求到客戶端。

  結語

  當然,本篇文章雖然分配了兩個場景,但是兩個場景下的方法以及試用方式並不衝突,使用的情況還是需要依照實際情況所示。並且這篇檔案並非formidable的所有屬性以及方法,只是介紹了相對常用而且相對重要的一些方法以及屬性,具體請參照npm官方中的文件。

  試用formidable的話你會快速的能夠在服務端中對引數以及傳入的資料進行處理,在開發的時候是很便捷的。對於剛上手的去編寫node服務端的前端來說,是一個非常好用的依賴工具。

  最後感謝大家支援,古德拜。