Развернул приложение Next.js в App Engine Standard [Nodejs] и получил ошибку 500 - PullRequest
0 голосов
/ 16 октября 2018

Я развернул на движке приложения с runtime-версией nodejs8 и получил 500. Я развертываю приложение next.js и после просмотра StackDriver получаю.Похоже, что .next может быть проигнорировано.Ошибка выглядит следующим образом:

throw new Error("Could not find a valid build in the '".concat(this.distDir, "' directory! Try building your app with 'next build' before starting the server."));

Error: Could not find a valid build in the '/srv/build' directory! Try building your app with 'next build' before starting the server. at Server.readBuildId (/srv/node_modules/next/dist/server/next-server.js:753:15) at new Server (/srv/node_modules/next/dist/server/next-server.js:80:25) at module.exports (/srv/node_modules/next/dist/server/next.js:6:10) at Object.<anonymous> (/srv/server.js:10:13) at Module._compile (module.js:653:30) at Object.Module._extensions..js (module.js:664:10) at Module.load (module.js:566:32) at tryModuleLoad (module.js:506:12) at Function.Module._load (module.js:498:3) at Function.Module.runMain (module.js:694:10)

Мой файл package.json выглядит следующим образом:

   {
  "name": "emails",
  "private": true,
  "version": "1.0.0",
  "main": "server.js",
  "scripts": {
    "dev": "NODE_ENV=development node server.js",
    "build": "next build",
    "lint": "standard",
    "prestart": "next build", 
    "start": "NODE_ENV=production node server.js",
    "appspot-deploy": "gcloud app deploy --project=email-app-219521",
    "deploy": "gcloud app deploy"
  },
  "standard": {
    "parser": "babel-eslint"
  },
  "license": "ISC",
  "dependencies": {
    "@firebase/app-types": "^0.3.2",
    "@material-ui/core": "^3.2.0",
    "@material-ui/icons": "^3.0.1",
    "@zeit/next-sass": "^1.0.1",
    "body-parser": "^1.18.3",
    "express": "^4.16.3",
    "express-rate-limit": "^3.2.1",
    "express-session": "^1.15.6",
    "firebase-admin": "^6.0.0",
    "isomorphic-unfetch": "^3.0.0",
    "memorystore": "^1.6.0",
    "next": "^7.0.1",
    "node-sass": "^4.9.3",
    "react": "^16.5.2",
    "react-dom": "^16.5.2",
    "styled-jsx-plugin-sass": "^0.3.0"
  },
  "devDependencies": {
    "babel-eslint": "^10.0.1",
    "eslint": "^5.6.1",
    "webpack": "^4.20.2"
  },
  "engines": {
    "node": "8.x.x"
  }
}

А мой файл app.yaml выглядит так:

runtime: nodejs8
env_variables:
  NODE_ENV: production
handlers:
- url: /.*
  script: server.js

И я обслуживаю свой проект с экспресс на порт 8080.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Мне только что удалось заставить это работать.Вот что я нашел:

Прежде всего, это не работает с пряжей.Кажется, команда gcp-build не запускается при наличии файла yarn.lock.

Теперь в package.json используйте следующие сценарии:

  "scripts": {
    "gcp-build": "next build",
    "start": "next start -p $PORT"
  }

И обязательно объявите Next и всемодули, необходимые в next.config.js как зависимости (не devDependencies)

К вашему сведению, у меня только runtime: nodejs10 в моем app.yaml, и только мои скрипты находятся в папке pages и next.config.js

0 голосов
/ 04 июля 2019

Это случилось со мной, когда я удалил файл, на который ссылалась одна из моих страниц (в папке / pages).

Либо восстановите этот файл, либо удалите файл, который ссылается на отсутствующий файл.

0 голосов
/ 16 октября 2018

Когда ваше приложение возвращает 500 ошибок, обязательно посмотрите журналы stdout и stderr вашего приложения в Stackdriver Logging на https://console.cloud.google.com/logs/viewer. Дважды проверьте, что вы просматриваете ресурс "Приложение GAE"picker.

Глядя на сообщение об ошибке, кажется, что папка .next не существует в вашем приложении.Эта папка .next является папкой, которая обычно создается с помощью "шага сборки", и я действительно вижу, что у вас есть "build": "next build" как script в вашем package.json.

Вы не должны бытьиспользуя prestart для выполнения этого шага сборки, сначала потому, что App Engine не запускает prestart при запуске экземпляра, но также и потому, что в целом это будет плохо для производительности.

У вас есть два способа создать эту папку:

  1. Создайте .next на своем компьютере перед развертыванием, для этого вы можете изменить скрипт deploy на: "deploy": "npm run build && gcloud app deploy".(А также убедитесь, что файл .gcloudignore не содержит .next или не содержит содержимого файла .gitignore)

  2. Запустите этот шаг сборки на серверах Google Cloudпосле развертывания: среда выполнения Node.js App Engine выполнит любой сценарий gcp-build, если он есть.Это означает, что вы можете добавить этот скрипт: "gcp-build": "npm run build" к вашему package.json.При этом я рекомендую вам добавить .next в файл .gcloudignore, чтобы папка .next не загружалась во время развертывания.

Кроме того, обратите внимание, чтоВы можете упростить app.yaml до runtime: nodejs8:

  • NODE_ENV автоматически устанавливается на production, вы можете удалить его
  • Ваш раздел обработчиков эквивалентенпо умолчанию.
...