web-dev-qa-db-fra.com

Déploiement d'une application Next.js vers App Engine Standard [Nodejs] et erreur 500

J'ai déployé sur le moteur d'application avec le runtime nodejs8 et j'ai obtenu un 500. Je déploie une application next.js, et après avoir examiné StackDriver, je reçois. Il semble que .next soit ignoré. L'erreur est la suivante:

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)

Mon fichier package.json ressemble à:

   {
  "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"
  }
}

Et mon fichier app.yaml ressemble à:

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

Et je suis en train de servir mon projet avec express sur le port 8080.

6
daviddavis

Lorsque votre application renvoie 500 erreurs, assurez-vous de consulter les journaux stdout et stderr de votre application dans Stackdriver Logging à https://console.cloud.google.com/logs/viewer . Vérifiez que vous recherchez le sélecteur de ressources "Application GAE".

En regardant le message d'erreur, il semble que le dossier .next N'existe pas dans votre application. Ce dossier .next Est un dossier qui est généralement généré via une "étape de construction", et je vois en effet que vous avez "build": "next build" En tant que script dans votre package.json.

Vous ne devez pas utiliser prestart pour effectuer cette étape de génération, d'abord parce que App Engine n'exécute pas prestart au démarrage de l'instance, mais aussi parce qu'en général, ce serait mauvais pour les performances.

Vous avez deux façons de créer ce dossier:

  1. Générez .next Sur votre machine avant le déploiement, pour ce faire, vous pouvez changer votre script deploy en: "deploy": "npm run build && gcloud app deploy". (Et assurez-vous également que le fichier .gcloudignore Ne contient pas .next Ou n'inclut pas le contenu du fichier .gitignore)

  2. Exécutez cette étape de génération sur les serveurs de Google Cloud après le déploiement: le runtime Node.js App Engine exécutera tout script gcp-build S'il est présent. Cela signifie que vous pouvez ajouter ce script: "gcp-build": "npm run build" À votre package.json. Ce faisant, je vous recommande d'ajouter .next Au fichier .gcloudignore Afin que le dossier .next Ne soit pas téléchargé au moment du déploiement.

De plus, notez que vous pouvez simplifier votre app.yaml En seulement runtime: nodejs8:

  • NODE_ENV Est automatiquement défini sur production, vous pouvez le supprimer
  • Votre section gestionnaires est équivalente à celle par défaut.
5
Steren

Je viens de réussir à le faire fonctionner. Voici ce que j'ai trouvé:

Tout d'abord, cela ne fonctionne pas avec Yarn. Il semble gcp-build la commande ne s'exécute pas lorsqu'il y a yarn.lock fichier.

Maintenant en package.json, utilisez les scripts suivants:

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

Et assurez-vous de déclarer Next et tous les modules nécessaires dans next.config.js as dépendances (pas devDependencies)

Pour info je n'ai que runtime: nodejs10 dans mon app.yaml et seuls les scripts que j'ai se trouvent dans le dossier pages et next.config.js

1
Varoot Phasuthadol

Cela m'est arrivé lorsque j'ai supprimé un fichier auquel une de mes pages (dans le dossier/pages) faisait référence.

Restaurez ce fichier ou supprimez le fichier qui fait référence au fichier manquant.

0
Nnenna Ude