6

我使用 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 上使用 express 服务我的项目。

4

3 回答 3

14

当您的应用程序返回 500 错误时,请务必在https://console.cloud.google.com/logs/viewer的 Stackdriver Logging 中查看您的应用程序的stdout日志。仔细检查您是否正在查看“GAE 应用程序”资源选择器。stderr

查看错误消息,.next您的应用中似乎不存在该文件夹。此.next文件夹是通常通过“构建步骤”生成的文件夹,我确实看到您"build": "next build"的.scriptpackage.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.yamlruntime: nodejs8

  • NODE_ENV自动设置为production,您可以将其删除
  • 您的处理程序部分等同于默认部分。
于 2018-10-16T01:10:22.163 回答
3

我刚刚设法使它工作。这是我发现的:

首先,它不适用于 Yarn。似乎有文件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

于 2018-12-06T15:53:04.577 回答
0

当我删除我的一个页面(在 /pages 文件夹中)碰巧引用的文件时,这发生在我身上。

恢复该文件,或删除引用丢失文件的文件。

于 2019-07-04T00:14:32.793 回答