The Relay Network Layer

Network Layer #

為了要知道如何訪問你的 GraphQL 伺服器,Relay Modern 需要開發者在建立 Relay Environment 的實例時,提供一個實作 NetworkLayer 介面的物件。environment 使用這個 network layer 來執行 query、mutation、以及 subscription (如果你的伺服器支援它們)。這讓開發者可以使用任何的 transport (HTTP、WebSocket、等等) 以及最適合應用程式的身份認證,將 environment 與每個應用程式網路設定的細節分離。

現在建立 network layer 最簡單的方法是藉由 relay-runtime 套件裡的 helper:

const {Environment, Network} = require('relay-runtime');

// 定義一個函數來抓取一個操作 query/mutation/etc) 的結果
// 並回傳它的結果作為一個 Promise:
function fetchQuery(
  operation,
  variables,
  cacheConfig,
  uploadables,
) {
  return fetch('/graphql', {
    method: 'POST',
    headers: {
      // 添加身份認證和其他的標頭
      'content-type': 'application/json'
    },
    body: JSON.stringify({
      query: operation.text, // 從輸入來的 GraphQL text
      variables,
    }),
  }).then(response => {
    return response.json();
  });
}

// 從 fetch 函數建立 network layer
const network = Network.create(fetchQuery);

// 使用這個 network 建立 environment:
const environment = new Environment({
  ..., // 其他選項
  network,
});

記得這是一個幫助你入門的基礎範例。這個範例可以透過額外的功能來擴充,例如:請求/回應快取 (例如,當 cacheConfig.force 是 false 的時候啟用它) 以及上傳 form data 給 mutation (uploadables 參數)。