iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 18
0
Data Technology

GraphQL + ApolloData 入門系列 第 18

ApolloData & Upload套件 ServerPart(二)

  • 分享至 

  • xImage
  •  

介紹
上篇介紹了 Upload Server上傳 的設定,主要的處理程序是透過 busboy 在處理檔案的部分 這節來來說明這一個套件

這個套件主要是在分析處理表單的資料

Busboy 建構的參數設定使用 Object 設定,有以下config可以設定:

headers - object - 這些是傳入請求的HTTP標頭,由單個解析器使用。

    var busboy = new Busboy({ headers: req.headers });

highWaterMark - integer - 用於此Busboy實例的 highWaterMark(預設值:跟WritableStream 預設值一樣)。

fileHwm - integer - 用於文件流的 highWaterMark(預設值:跟ReadableStream 預設值一樣)。

defCharset - string - 預設的字符集(預設:'utf8')。

preservePath - boolean - multipart forms 的filename 將被保留路徑。(預設值:false)。

limits - object - 對輸入數據的各種限制。有效的屬性是:

*fieldNameSize - integer - 每個欄位名稱的大小(以 bytes 為單位)(預設值:100 bytes)。

*fieldSize - integer - 每個欄位最大的大小(以 bytes 為單位)(預設值:1MB)。

*fields - integer - 非文件字段的最大數目(預設值:無窮大)。

*fileSize - integer - 檔案的大小(以 bytes 為單位)(預設值:無窮大)。

*files - integer - multipart forms 檔案的數量(預設值:無窮大)。

*parts - integer - multipart forms,最大零件數量(filed+files)(預設值:無窮大)。

*headerPairs - integer - multipart forms,最大數量 header數量 =>預設值: 2000個(與 node 的http相同)。

構造函數可能會拋出錯誤:

1.不支持的內容類型:$type - Content-TypeBusboy 不能解析的內容。

2.缺少Content-Type - 提供的header不包含 Content-Type。

所以第一步一定要記得給 headers,以下是 busboy 的官方範例 有處理 file ,filed, finish 三個事件

 if (req.method === 'POST') {
    var busboy = new Busboy({ headers: req.headers });
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
      console.log('File [' + fieldname + ']: filename: ' + filename);
      file.on('data', function(data) {
        console.log('File [' + fieldname + '] got ' + data.length + ' bytes');
      });
      file.on('end', function() {
        console.log('File [' + fieldname + '] Finished');
      });
    });
    busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated) {
      console.log('Field [' + fieldname + ']: value: ' + inspect(val));
    });
    busboy.on('finish', function() {
      console.log('Done parsing form!');
      res.writeHead(303, { Connection: 'close', Location: '/' });
      res.end();
    });
    req.pipe(busboy);
  }  
 

理解了 busboy 的設定檔 再來看前一篇的 apollodata的 busboy 的部分
這樣就很清楚 headers 是為了解析 multipart forms 使用,limits就可以限制一些檔案的數量與大小設定

 const busboy = new Busboy({
      headers: request.headers,
      limits: {
        fieldSize: maxFieldSize,
        fields: 2, // Only operations and map
        fileSize: maxFileSize,
        files: maxFiles
      }
    })

總結

實例化一個 busboy 後就會透過 req的內容去解析表單內容物,這時候就可以透過 busboy.on 看要對filed 或是 file 再進一步的處理

busboy 套件位置
https://github.com/mscdex/busboy


上一篇
ApolloData & Upload套件 ServerPart(一)
下一篇
ApolloGraphql & Upload套件 ServerPart(三)
系列文
GraphQL + ApolloData 入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言