将Next.js应用程序部署到App Engine标准[Nodejs]并收到500错误

时间:2018-10-15 22:36:32

标签: google-app-engine google-appengine-node

我将其部署到具有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服务我的项目。

3 个答案:

答案 0 :(得分:6)

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

查看错误消息,看来.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,您可以将其删除
  • 您的处理程序部分等同于默认部分。

答案 1 :(得分:1)

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

首先,它不适用于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

答案 2 :(得分:0)

当我删除一个文件(在/ pages文件夹中)恰好正在引用的文件时,这发生在我身上。

要么还原该文件,要么删除引用丢失文件的文件。