我与React.js和Node.js + Express一起创建了一个网站。我将Google App Engine和Google数据存储区用于数据库。
在我的本地计算机上一切正常:
React前端能够访问Node服务的API链接。节点应用程序能够访问在云上运行的数据存储。
在本地机器上,我使用Proxy到Node的端口8080,以便React能够访问API链接。
从package.json文件:
"proxy": "http://localhost:8080/"
从React我使用URL进行API调用:
axios.get('/api/XXX'
我在Express中使用HTTP服务器。
当我将代码部署到Google App Engine时,我不确定需要做哪些更改,以便React应用程序能够访问Node API链接。 我需要Prod中的代理吗?如何从App Engine获取SSL密钥和证书以放入Express?我应该立即切换为使用HTTPS,还是可以继续使用HTTP,直到我将其余的构建基块调整为可以一起工作?
当我尝试访问以下链接时:
axios.get('https://my_custom_domain/api/XXX'
然后我的React应用程序无法访问任何API链接。在Chrome控制台中,我看到React会返回404错误。
我使用自定义域,并且看到Google App Engine显示我的域SSL安全性是“由Google管理的,自动续订”。 在节点中,我使用HTTP服务器。我想切换为使用HTTPS,但是我不明白如何从App Engine控制台获取私钥和证书,并将其放入Express应用中。
是否可以从App Engine控制台获取证书和私钥?还是我应该从另一方/公司购买新的SSL证书并在Express应用中使用它并将其上传到App Engine中?
这是我的Yaml文件: (server.js是我的Node应用)
runtime: nodejs8
handlers:
- url: /
static_files: build/index.html
upload: build/index.html
- url: /
static_dir: build
- url: /api/*
script: server.js
404错误与HTTPS有关。所以我也从HTTP切换到HTTPS服务器。但是,我必须在没有凭据的情况下启动HTTPS服务器,因为Google App Engine不允许我查看这些凭据。
这是我的工作:
var httpsServer = https.createServer(/*credentials,*/ app);
但是,我仍然遇到404错误:
> 无法加载https://www.XXXXX.XXX/api/v1/list:所请求的资源上没有“ Access-Control-Allow-Origin”标头。因此,不允许访问来源“ https://XXXXXXXXX.appspot.com”。响应的HTTP状态代码为404。
>
我使用了CORS库 var cors = require('cors'); app.use(cors());
但是,它仍然无济于事,我得到了跨原点错误。
我还尝试在App.Yaml中引入以下行:
http_headers:
Access-Control-Allow-Origin: https://xxxxxx.appspot.com
但是,当我尝试部署代码时,gcloud app deploy
gcloud不喜欢该标头,即使它来自其官方文档:)我认为因为API被认为是动态处理程序,因此无法向其添加http_headers。
gcloud控制台的错误是:
解析文件时发生错误:[/ xxxxxx / app.yaml]
映射类型脚本的意外属性“ http_headers”。
在“ /Users/xxxxxx/app.yaml”中
所以我不确定如何解决跨域问题。
(我很奇怪,没有网站可以解释如何在PROD中为Google App引擎设置React + Node / Express。这是一个非常典型的体系结构)
答案 0 :(得分:2)
如果您将自定义域与Google-managed SSL certificates一起使用,则应该能够自动向生产应用发出HTTPS请求,而无需自己处理任何SSL密钥。假设您在日志中看到404,看起来请求已经到达您的应用程序,但是没有路由到所需的处理程序代码。
您的app.yaml
配置存在一些问题:
1。。对于Node.js App Engine环境,script
的{{1}}键下条目的handlers
键的唯一有效值}文件为app.yaml
(请参见this documentation)。另外,auto
键是可选的。
2。。script
应该为- url: /api/*
。请参见same documentation中有关- url: /api/.*
键的部分。
3。。因为App Engine尝试从头到尾将传入请求与url
中的条目进行匹配,并且带有handlers
的条目将与以{em>(static_dir
中的值开头(请参见same documentation:“以该前缀开头的所有URL均由该处理程序处理,使用该前缀之后的URL部分作为文件路径”),例如url
的请求将与此处理程序匹配:
/api/v1/list
因此,App Engine将尝试在应用程序代码中的- url: /
static_dir: build
处提供静态文件,找不到任何此类文件,然后返回build/api/v1/list
。您应该重新排序处理程序,以便以404
开头的请求将首先找到API处理程序。
尝试此更新的/api
:
app.yaml