代码之家  ›  专栏  ›  技术社区  ›  th3g3ntl3man

谷歌应用引擎-使用相同的App.yaml部署不同的文件夹

  •  0
  • th3g3ntl3man  · 技术社区  · 4 年前

    我有这个文件夹树:

    enter image description here

    这是我的真实 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;
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   Dan Cornilescu    4 年前

    我无法确定 package.json server.js 文件,既不在 app.yaml reference ,也不在 gcloud app deploy reference ,所以我想它必须和 app.yaml 文件(如 sample app ).

    您看到的错误很可能是由于部署命令在预期的位置找不到提到的文件造成的。

    换句话说,你必须移动/复制 app.yaml 文件在 server 目录。它 可以 如果您还想从另一个目录部署,可以将文件符号链接以避免实际的代码重复(它适用于标准环境,但我不确定灵活的环境是否也是如此)。

    旁注:我认为你的静态处理程序(我怀疑这也可能是你寻求这种应用程序结构的原因)不会起作用—— app.yaml引用 或在 Serving Static Files 部分。也许你不小心看了标准环境文档?(检查 How to tell if a Google App Engine documentation page applies to the 1st/2nd generation standard or the flexible environment )如果你把处理器扔掉,剩下的就很少了 app.yaml file-这样做的重用价值相当低(如果可能的话)。我只会保持简单,坚持推荐的方式。