Google App Engine - разверните другую папку с тем же app.yaml - PullRequest
0 голосов
/ 14 марта 2020

У меня есть это дерево папок:

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 checker: ни один из "start" в разделе «сценарии» пакета «. json» и файла «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;

1 Ответ

1 голос
/ 14 марта 2020

Я не вижу способа указать расположение файлов package.json и server.js, ни в app.yaml ссылка , ни в ссылка на развертывание приложения gcloud , поэтому я предполагаю, что он должен располагаться рядом с файлом app.yaml (как видно из примера приложения ).

Ошибка, которую вы видите, вполне может быть вызвано тем, что команда развертывания не находит упомянутые файлы там, где она их ожидает.

Другими словами, вам придется переместить / скопировать файл app.yaml в каталог server. может быть возможна символическая ссылка на файл, чтобы избежать реального дублирования кода, если вы хотите также выполнить развертывание из другого каталога (это работает для стандартной среды, но я не уверен, что то же самое верно для гибкого). ).

Примечание: я не думаю, что ваши обработчики stati c (которые, я подозреваю, также могут быть причиной, по которой вы ищите такую ​​структуру приложения) будут работать - об этом нет никаких упоминаний app.yaml ссылка или в разделе Обслуживающие данные c Файлы . Может быть, вы случайно посмотрели стандартную документацию по среде? (отметьте Как определить, относится ли страница документации Google App Engine к стандарту 1-го / 2-го поколения или к гибкой среде ). Если вы отбросите обработчики, в файле app.yaml останется очень мало - довольно мало повторно использовать значение для этого (если возможно). Я бы просто все упростил и придерживался рекомендованного способа.

...