Svelte / Sapper Как получить данные из внутреннего API без указания абсолютного URL

Я использую svelte / sapper с экспрессом.

У меня есть api в routes/billing/index.js

Ему нужно получить данные из customers/[customernumber]/detections.js

Мой вопрос в том, как получить данные из внутреннего API в папке маршрутов с использованием относительных URL-адресов

async function getDataFromGateway(customerNumber) {
  if (typeof fetch !== 'function') {
    global.fetch = require('node-fetch')
  }
  const data = await fetch(`http://localhost:19052/customers/${customerNumber}/detections`)
    .then(res => res.json())
    .catch(error => {
      console.log(error)
      return error
    }
    )
  return data
}

Есть ли способ сделать это с помощью относительного URL-адреса


person Narasimhan    schedule 07.02.2020    source источник


Ответы (1)


Самый простой способ - получить эти данные внутри preload, используя this.fetch, поскольку это будет автоматически обрабатывать относительные URL-адреса одинаково, независимо от того, запущены они на сервере или на клиенте:

<script context="module">
  export async function preload(page, session) {
    const r = await this.fetch(`customers/${getCustomerNumber(session)}/detections`);
    const data = await r.json();

    return {
      foo: data.foo
    };
  }
</script>

Если это невозможно по какой-либо причине, вам может потребоваться настроить переменную среды, например BASE_URL:

async function getDataFromGateway(customerNumber) {
  if (typeof fetch !== 'function') {
    global.fetch = require('node-fetch')
  }
  const data = await fetch(`${process.env.BASE_URL}/customers/${customerNumber}/detections`)
    .then(res => res.json())
    .catch(error => {
      console.log(error)
      return error
    }
    )
  return data
}
person Rich Harris    schedule 07.02.2020
comment
Спасибо, Харрис. Цени свое время. Но есть ли способ использовать this.fetch вне <script context="module">, в файле javaScript - person Narasimhan; 10.02.2020
comment
Нет, потому что он контекстный - он разрешает URL-адреса относительно подготовленного маршрута. - person Rich Harris; 12.02.2020
comment
Обсуждали это в саперном канале раздора. Разве выполнение HTTP-запроса не является ненужным и неэффективным / медленным? Как насчет вызова того же кода, который запускается /customers/${customerNumber}/detections, если вы знаете, что находитесь на сервере, и выполнения выборки, если вы знаете, что находитесь на клиенте? - person BoomShaka; 20.08.2020
comment
Вскоре я напишу RFC, посвященный именно этой теме. - person Rich Harris; 24.08.2020