我将其部署到具有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服务我的项目。
答案 0 :(得分:6)
当应用程序返回500个错误时,请确保在https://console.cloud.google.com/logs/viewer的Stackdriver Logging中查看应用程序的stdout
和stderr
日志。仔细检查您是否正在查看“ GAE应用程序”资源选择器。
查看错误消息,看来.next
文件夹在您的应用程序中不存在。这个.next
文件夹是一个通常通过“构建步骤”生成的文件夹,我确实发现您在"build": "next build"
中拥有script
作为package.json
。>
您不应该使用prestart
来执行此构建步骤,首先是因为App Engine在实例启动时未运行prestart
,而且还因为总体上这会降低性能。
您可以通过两种方式创建此文件夹:
在部署之前在计算机上生成.next
,为此,您可以将deploy
脚本更改为:"deploy": "npm run build && gcloud app deploy"
。 (还要确保.gcloudignore
文件不包含.next
或不包含.gitignore
文件的内容)
在部署后在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文件夹中)恰好正在引用的文件时,这发生在我身上。
要么还原该文件,要么删除引用丢失文件的文件。