如何在 AWS Amplify 上 运行 代理 react/redux 应用程序
How to run proxy for react/redux application on AWS Amplify
我最近为我的 React App 实现了 Proxy(在 Express.js 中)以隐藏 API URL's 在提出请求时。当我 运行 它是本地主机上的代理和应用程序时,它一直运行良好。既然我已准备好将我的应用程序部署到 AWS Amplify,我对如何让代理到 [=69] 有点困惑=] 因为我没有从 CLI 手动启动应用程序和代理。我需要使用 EC2 实例 还是可以使用 Amplify 来实现?
任何帮助将不胜感激!
这是我的项目目录的样子:
这就是我的 Server.js 的样子:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const axios = require('axios');
var cors = require('cors')
app.use(cors())
app.use(bodyParser.urlencoded({
extended: false
}));
const BASE_URL = 'https://my-aws-lambda-base-url/dev'
const port = process.env.PORT || 5000;
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
});
app.listen(port, () => console.log(`Listening on port ${port}`));
app.use('/contact', require('body-parser').json(), async (req, res) => {
try {
await axios.post(`${BASE_URL}/contact`, {
Email : req.body.Email,
type : req.body.type,
Message : req.body.Message,
Phone : req.body.Phone
},
{
headers: {
'Content-Type': 'application/json',
}
},
).then(function(response) {
const result = response.data
console.log(result)
if(result && result.Message) {
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify(result))
}
}).catch((e)=> {
console.log(e)
res.send(false)
})
} catch (error) {
console.log(error)
res.send(false)
}
});
这就是我在我的 React 应用程序中发出请求的方式
export async function sendContact(request){
try {
if(!request.Phone)
request.Phone = false
if(request.textMe){
request.type = "BOTH"
}
else{
request.type = "EMAIL"
}
let result ;
await fetch('/contact', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
Email : request.Email,
type : request.type,
Message : request.Message,
Phone : request.Phone
})
}
).then(async response =>
await response.json()
).then(data =>
result = data
).catch((e)=> {
notifyError(e.response.data.Message)
return false
})
console.log(result)
return result
} catch (error) {
console.log(error)
}
}
最后,这是来自 Amplify 的我的应用程序构建脚本
version: 1
frontend:
phases:
preBuild:
commands:
- npm i
build:
commands:
- npm run build
artifacts:
baseDirectory: build
files:
- '**/*'
cache:
paths:
- node_modules/**/*
P.S : 我也有 "proxy": "http://localhost:5000"
添加到我的 Package.json
编辑:
我尝试使用 PM2 之类的后台任务管理器来 运行 post 在构建脚本中构建,但仍然无效(尽管它在本地有效)
我最终启动了一个代理 lambda 作为我的客户端和服务器之间的 API 网关(中间人)。我也有代理拒绝任何不是来自我网站的请求。
我最近为我的 React App 实现了 Proxy(在 Express.js 中)以隐藏 API URL's 在提出请求时。当我 运行 它是本地主机上的代理和应用程序时,它一直运行良好。既然我已准备好将我的应用程序部署到 AWS Amplify,我对如何让代理到 [=69] 有点困惑=] 因为我没有从 CLI 手动启动应用程序和代理。我需要使用 EC2 实例 还是可以使用 Amplify 来实现?
任何帮助将不胜感激!
这是我的项目目录的样子:
这就是我的 Server.js 的样子:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const axios = require('axios');
var cors = require('cors')
app.use(cors())
app.use(bodyParser.urlencoded({
extended: false
}));
const BASE_URL = 'https://my-aws-lambda-base-url/dev'
const port = process.env.PORT || 5000;
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
});
app.listen(port, () => console.log(`Listening on port ${port}`));
app.use('/contact', require('body-parser').json(), async (req, res) => {
try {
await axios.post(`${BASE_URL}/contact`, {
Email : req.body.Email,
type : req.body.type,
Message : req.body.Message,
Phone : req.body.Phone
},
{
headers: {
'Content-Type': 'application/json',
}
},
).then(function(response) {
const result = response.data
console.log(result)
if(result && result.Message) {
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify(result))
}
}).catch((e)=> {
console.log(e)
res.send(false)
})
} catch (error) {
console.log(error)
res.send(false)
}
});
这就是我在我的 React 应用程序中发出请求的方式
export async function sendContact(request){
try {
if(!request.Phone)
request.Phone = false
if(request.textMe){
request.type = "BOTH"
}
else{
request.type = "EMAIL"
}
let result ;
await fetch('/contact', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
Email : request.Email,
type : request.type,
Message : request.Message,
Phone : request.Phone
})
}
).then(async response =>
await response.json()
).then(data =>
result = data
).catch((e)=> {
notifyError(e.response.data.Message)
return false
})
console.log(result)
return result
} catch (error) {
console.log(error)
}
}
最后,这是来自 Amplify 的我的应用程序构建脚本
version: 1
frontend:
phases:
preBuild:
commands:
- npm i
build:
commands:
- npm run build
artifacts:
baseDirectory: build
files:
- '**/*'
cache:
paths:
- node_modules/**/*
P.S : 我也有 "proxy": "http://localhost:5000"
添加到我的 Package.json
编辑:
我尝试使用 PM2 之类的后台任务管理器来 运行 post 在构建脚本中构建,但仍然无效(尽管它在本地有效)
我最终启动了一个代理 lambda 作为我的客户端和服务器之间的 API 网关(中间人)。我也有代理拒绝任何不是来自我网站的请求。