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.
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:
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
)
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 supprimerJe 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
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.