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

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

runtime: nodejs8

handlers:
  - url: /apiEndPoint
    script: auto

  - url: /.*
    static_dir: public

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

3 ответа

Итак, чтобы быть ясным - вы можете размещать статические файлы в стандартном AppEngine Nodejs без необходимости использования 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'));
}

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

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

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

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

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

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

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

Другие вопросы по тегам