我已经使用next.js开发了一个React应用程序。
现在我要将其部署到Google Cloud App Engine。
该应用程序的确包含了React前端和一个模拟API(包括mock.db),以便在开发过程中临时存储数据。
问题如下:我打开的第一个实例工作正常。当我在另一个浏览器中打开它时,仅提供了react应用,但没有提供API(导致React应用仅显示控件框架而没有数据)。可通过localhost:3033访问API服务器
对试图打开它的我的同事来说,同样的感觉,只看到白色。
我没有在Google Cloud App Engine上配置任何其他功能,基本上只是香草。
[与App Engine分解额外的实例有关吗?我不知道是什么原因导致此问题。
的package.json
"prestart:api": "node createMockDb.js",
"start:api": "node apiServer.js",
"dev": "node server.js",
"build": "next build",
"start": "cross-env NODE_ENV=production node server.js & node createMockDB.js & node apiServer.js"
server.js
const express = require("express");
const next = require("next");
const port = parseInt(process.env.PORT, 10) || 8080;
const dev = process.env.NODE_ENV !== "production";
const app = next({ dev });
const handle = app.getRequestHandler();
app.prepare().then(() => {
const server = express();
server.get("/products/overview", (req, res) => {
return app.render(req, res, "/products/overview", req.query);
});
server.get("/products/roadmap", (req, res) => {
return app.render(req, res, "/products/roadmap", req.query);
});
server.get("/strategy/goals", (req, res) => {
return app.render(req, res, "/strategy/goals", req.query);
});
server.get("/strategy/metrics", (req, res) => {
return app.render(req, res, "/strategy/metrics", req.query);
});
/* server.get("/posts/:id", (req, res) => {
return app.render(req, res, "/posts", { id: req.params.id });
}); */
server.all("*", (req, res) => {
return handle(req, res);
});
server.listen(port, err => {
if (err) throw err;
console.log(`> Ready on http://localhost:${port}`);
});
});
apiServer.js
/* eslint-disable func-names */
/* eslint-disable no-console */
const jsonServer = require("json-server");
const server = jsonServer.create();
const path = require("path");
const router = jsonServer.router(path.join(__dirname, "server/db.json"));
const middlewares = jsonServer.defaults({
static: "node_modules/json-server/dist"
});
server.use(middlewares);
server.use(jsonServer.bodyParser);
server.use(function(req, res, next) {
setTimeout(next, 0);
});
function createSlug(value) {
return value
.replace(/[^a-z0-9_]+/gi, "-")
.replace(/^-|-$/g, "")
.toLowerCase();
}
function validateProduct(product) {
if (!product.title) return "Title is required.";
if (!product.tagline) return "Tagline is required.";
if (!product.description) return "Description is required.";
return "";
}
server.use((req, res, next) => {
if (req.method === "POST") {
req.body.createdAt = Date.now();
}
next();
});
server.post("/products/", function(req, res, next) {
const error = validateProduct(req.body);
if (error) {
res.status(400).send(error);
} else {
req.body.slug = createSlug(req.body.title);
next();
}
});
server.use(router);
const port = 3033;
server.listen(port, () => {
console.log(`JSON Server is running on port ${port}`);
});
[您似乎正在尝试通过单个应用程序引擎实例中的npm start
命令启动多个Web服务器:
"start": "cross-env NODE_ENV=production node server.js & node createMockDB.js & node apiServer.js"
我以前从未见过,我非常怀疑GAE是否可以处理它。 GAE期望单节点应用程序在端口process.env.PORT
上处理请求。
如果要在同一GAE项目中运行多个不同的服务器,则可能应将它们作为不同的服务独立部署。它们每个都应有一个app.yaml
,用于指定唯一的服务名称,并且您将分别独立地部署它们。 documentation here相当全面。