node.js - Google App Engine - 使用相同的 app.yaml 部署不同的文件夹
问题描述
我有这个文件夹树:
这是我的实际app.yaml
:
runtime: nodejs
env: flex
manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
handlers:
- url: /api/.*
static_files: server/server.js
upload: server/server.js
- url: /
static_files: www/build/index.html
upload: www/build/index.html
- url: /
static_dir: www/build
但总是,当我尝试使用以下命令部署应用程序时:gcloud app deploy --stop-previous-version
进程结束时出现此错误:
步骤#0:应用程序检测失败:错误:node.js 检查器:“package.json”的“scripts”部分中的“start”和“server.js”文件均未找到。
是server/package.json
:
{
"name": "server",
"version": "1.5.2",
"engines": {
"node": "13.x"
},
"main": "server.js",
"description": "ConstaFAST server",
"scripts": {
"start": "node server.js"
},
"license": "MIT",
"dependencies": {
"@hapi/joi": "^16.1.7",
"base64-img": "^1.0.4",
"bcryptjs": "^2.4.3",
"body-parser": "^1.19.0",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"generate-password": "^1.4.2",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.8.4",
"nodemailer": "^6.4.2",
"pdfkit": "^0.11.0",
"qrcode": "^1.4.4"
},
"devDependencies": {
"morgan": "^1.9.1"
}
}
是www/package.json
:
{
"name": "www",
"version": "0.1.6",
"private": true,
"engines": {
"node": "13.x"
},
"dependencies": {
"@material-ui/core": "^4.8.2",
"@material-ui/icons": "^4.5.1",
"bootstrap": "^4.4.1",
"formik": "^2.1.1",
"jspdf": "^1.5.3",
"qrcode": "^1.4.4",
"qrcode.react": "^1.0.0",
"react": "^16.11.0",
"react-bootstrap": "^1.0.0-beta.14",
"react-dom": "^16.11.0",
"react-router": "^5.1.2",
"react-router-dom": "^5.1.2",
"react-scripts": "3.3.0",
"react-stripe-elements": "^6.0.1",
"yup": "^0.28.0"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
最后,内容server/server.js
是:
const express = require('express');
const app = express();
const path = require('path');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
require('dotenv').config()
const agencyRoutes = require('./api/routes/agency');
const companyRoutes = require('./api/routes/company');
const userRoutes = require('./api/routes/user');
const qrcodeRoutes = require('./api/routes/qrcode');
const vehicleRoutes = require('./api/routes/vehicle');
const writerRoutes = require('./api/routes/writer');
const port = process.env.PORT || 8080;
mongoose.connect(String(process.env.DB_CONNECT), {
useCreateIndex: true,
useNewUrlParser: true,
useUnifiedTopology: true
}, () => console.log('Connect to the database'));
mongoose.Promise = global.Promise;
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use( (req, res, next) => {
res.header('Access-Control-Allow-Origin', 'https://constafast.cf');
res.header(
'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept, Authorization'
);
res.header('Connection', 'Keep-Alive');
if ( req.method === 'OPTIONS' ) {
res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET');
return res.status(200).json({});
}
next();
});
app.use(express.static(path.resolve(__dirname, '../www', 'build')));
app.use('/api/agency', agencyRoutes);
app.use('/api/company', companyRoutes);
app.use('/api/user', userRoutes);
app.use('/api/qrcode', qrcodeRoutes);
app.use('/api/vehicle', vehicleRoutes);
app.use('/api/writer', writerRoutes);
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, '../www', 'build', 'index.html'));
});
app.use( (req, res, next) => {
const error = new Error('Not found');
error.status = 404;
next(error);
});
app.use( (error, req, res, next) => {
res.status(error.status || 500);
res.json({
error: {
message: error.message
}
});
});
app.listen(port, () => console.log(`Server up and running on port ${port}`));
module.exports = app;
解决方案
我看不到在app.yaml 参考和gcloud app deploy 参考package.json
中指定andserver.js
文件位置的方法,所以我猜它必须与文件并排放置(如所见在示例应用程序中)。app.yaml
您看到的错误很可能是由于部署命令没有在预期的位置找到提到的文件引起的。
换句话说,您必须移动/复制目录app.yaml
中的server
文件。如果您还想从另一个目录部署(它适用于标准环境,但我不确定对于灵活的环境也是如此),可以对文件进行符号链接以避免实际的代码重复。
旁注:我不认为您的静态处理程序(我怀疑这也可能是您寻求此类应用程序结构的原因)将起作用 - app.yaml 参考或服务静态文件中没有提及此类功能部分。也许您不小心查看了标准环境文档?(检查如何判断 Google App Engine 文档页面是否适用于第 1 代/第 2 代标准或柔性环境)如果您删除处理程序,则文件中剩下的东西很少app.yaml
- 重用价值相当低所以(如果可能的话)。我只是保持简单并坚持推荐的方式。
推荐阅读
- node.js - 在猫鼬中找到所有
- c# - EF Core 调用具有多个连接的存储过程并映射相关数据
- apache-spark - 为什么 Spark 结构化流 org.apache.spark.sql.functions.input_file_name 返回空白文件名
- laravel - Laravel 8 从下到上的路线顺序
- sql - 关联没有重复结果的三列查询
- python - 排除日期字段的df行:时间/秒在特定时期之间
- c# - 使用 Polly.Net 的嵌套重试和断路器策略的意外行为
- android - 如何使用 AccessibilityService 收听软键盘点击?
- maven - 显式定义可被 intellij 和 maven 接受的项目源以进行项目设置
- ios - react-navigation 安装导致构建失败