Как обслуживать статические файлы в AppEngine Standard и nodejs

В документации говорится, что вы просто должны обновить свое приложение. .yaml — как и для любого языка в AppEngine. Позже в нем также говорится, что для локальной разработки вы, вероятно, захотите, чтобы ваш сервер также отвечал на статические запросы. Однако, когда я обновляю свой очень простой app.yaml, чтобы он был таким:

runtime: nodejs8

handlers:
  - url: /apiEndPoint
    script: auto

  - url: /.*
    static_dir: public

Кажется, что все запросы по-прежнему поступают в мой скрипт, который возвращает 404 в экземпляре prod, поскольку эти файлы не будут загружены. Я могу принудительно загрузить их, и тогда мой сервер nodejs ответит на статические запросы, но я думал, что идея этого app.yaml заключалась в том, чтобы настроить его так, чтобы статические файлы обслуживались вне логики моего приложения?


person yathern    schedule 16.06.2018    source источник
comment
Можете ли вы показать журнал сервера разработки для одного такого запроса?   -  person Dan Cornilescu    schedule 16.06.2018
comment
@DanCornilescu - в журналах просто говорится, что этому URL-адресу не соответствует ни один обработчик. для запроса к /index.html или /. Фактический ответ HTTP показывает в заголовках, что он был обработан Express — веб-сервером node.js. Вместо этого он вообще не должен передаваться в Express и должен обрабатываться тем, что AppEngine использует для размещения статических файлов. По крайней мере, это мое предположение, но документы не слишком ясно показывают, как это происходит, и все примеры GitHub также размещают статические файлы через Express, поскольку это должно быть сделано для локального разработчика.   -  person yathern    schedule 16.06.2018
comment
эти файлы не будут загружены, что вы имеете в виду?   -  person Steren    schedule 22.06.2018


Ответы (3)


Итак, для ясности: вы можете размещать статические файлы в производственной версии Nodejs Standard AppEngine без необходимости использования JS-сервера. Однако для локальной разработки вы должны найти способ обслуживать эти файлы локально при работе на вашем компьютере. По этой причине вы помещаете обработчик в Express для статических файлов, которые никогда не следует трогать в продакшене, поскольку обработчик app.yaml является первым проходом.

Если вы хотите быть уверены, что Express.js не обслуживает статические файлы в рабочей среде, вы можете сделать это, выполнив что-то вроде этого:

// Production instances automatically have this environment variable.
const isLocal = (process.env.NODE_ENV !== "production");

if(isLocal) {
  app.use(express.static('public'));
}
person yathern    schedule 17.06.2018

Статические файлы загружаются во время развертывания, но не в том же месте, что и код приложения. Они загружаются в инфраструктуру Google, предназначенную для прямого обслуживания статического контента. Это можно подтвердить, увеличив детализацию журнала команды развертывания.

Когда URL-адрес запроса соответствует одному из статических обработчиков, он должен быть направлен в эту выделенную инфраструктуру, он не должен достигать кода вашего приложения. Это должно быть относительно легко подтвердить с помощью фактического развертывания.

Что касается локальной разработки, я не совсем уверен, как ведет себя сервер Node.Js (действительно, документы предполагают, что Express может потребоваться для обработки статических файлов), но Python сам обслуживает статические файлы, основываясь исключительно на app.yaml конфигурации статического обработчика, не затрагивая код приложения. Возможно, из-за все еще очень новой поддержки стандартной среды Node.JS.

person Dan Cornilescu    schedule 16.06.2018
comment
Спасибо за ответ - в качестве обновления - если я полностью удалю сервер Express, я смогу обслуживать файлы, используя static_files, который появляется, - который обслуживает серверы Google Frontend. Static_dir, похоже, не работает, но я еще немного поиграюсь с ним. РЕДАКТИРОВАТЬ: понял это! Оказывается, static_dir не работает так, как я думал, с подстановочными знаками. Просто укажите '/', чтобы перехватывать все запросы. Что имеет смысл. - person yathern; 16.06.2018

Статические файлы, которые вы хотите обслуживать, должны быть развернуты вместе с кодом вашего приложения с помощью gcloud app deploy.

Ваш app.yaml файл говорит:

  • Любой запрос, соответствующий /apiEndPoint, будет перенаправлен в ваше приложение Node.js.
  • Любой другой URL-адрес запроса будет обслуживать статический файл из вашей папки public и не будет поступать в ваше приложение (после развертывания).

Например: /index.html будет обслуживать public/index.html, если этот файл не был развернут, то он вернет страницу 404.

person Steren    schedule 22.06.2018