同时打开我们的后端服务和Notes项目,发现获取不到数据,这是因为违反了同源策略
(两个 URL 具有相同的协议端口,则称它们是“同源”的)
image.png

Same origin policy and CORS

CORS(cross-origin resource sharing) 跨源资源共享
我们可以通过使用 Node 的cors 中间件来允许来自其他源的请求。
安装

  1. npm install cors

使用cors中间件,并允许所有来源的请求

  1. const cors = require('cors')
  2. app.use(cors())

Application to the Internet

将应用迁移到https://www.Heroku.com
官方文档

向项目的根目录添加一个名为 Procfile的文件(没有后缀名),告诉 Heroku 如何启动应用。

  1. web: npm start

更改index.js中端口定义

  1. const PORT = process.env.PORT || 3001

注册Heroku账号
下载并安装Heroku CLI
image.png
进入项目根目录
git init 创建你的本地仓库
把node_module和.env写进.gitignore文件
git add/commit 提交
登录heroku(注意要加-i, 不然会报错ip address mismatch)

  1. heroku login -i

登录会把SSH公钥上传到Heroku, 否则无法git push
创建Heroku App

  1. heroku create

push 到Heroku

  1. git push heroku master

如果要push到github, 则在github创建仓库, origin代表仓库名,可以自定义,-u代表默认推送

  1. git remote add origin 仓库地址
  2. git push -u origin master

应用现在已经部署了,确保至少一个 app 的实例正在运行

  1. heroku ps:scale web=1

现在,可以用heroku create时产生的URL 访问 app. 有一个便捷的方法, 你可以像这样打开web站点

  1. heroku open

image.png

查看日志

  1. heroku logs -t

现在将notes项目中的baseUrl改成heroku上的地址也能正常工作

Frontend production build

运行下列命令,将前端项目打包,会生成一个build目录

  1. yarn build
  2. #或者
  3. npm run build

Serving static files from the backend

部署前端的一个选择是将生产构建( build 目录)复制到后端仓库的根目录,并配置后端以显示前端的 main page (文件 build/index.html)作为其主页。
将build目录复制到notes-backend根目录

  1. cp -r build ../notes-backend

为了让 express 显示 static content、 页面 index.html 和它用来fetch的 JavaScript 等等,我们需要一个来自 express 的内置中间件,称为static
在后端index.js中添加如下内容

  1. app.use(express.static('build'))

git add/commit/push heroku master 将更改提交并推送到heroku远程仓库
此时heroku open就可以看到显示前端页面了
yarn dev运行本地的后端服务,也可以在http://localhost:3001/看到前端页面
image.png
因为此时前端和后端都在同一个地址,可以将baseUrl改为相对地址

  1. const baseUrl = '/api/notes'

重新打包

  1. rm -rf build
  2. yarn build

将build目录重新复制到后端根目录,重新提交
如果出现下列报错,重新打开一个bash终端即可
image.png

Streamlining deploying of the frontend

流程化前端部署
在后端package.json的scripts中添加下列代码, 相对路径根据实际情况修改:

  1. {
  2. "scripts": {
  3. //...
  4. "build:ui": "rm -rf build && cd ../part2-notes/ && npm run build --prod && cp -r build ../notes-backend",
  5. "deploy": "git push heroku main",
  6. "deploy:full": "npm run build:ui && git add . && git commit -m uibuild && git push && npm run deploy",
  7. "logs:prod": "heroku logs --tail"
  8. }
  9. }

这样在后端通过npm run或者yarn 运行指令,就可以完成前端和后端的自动打包和部署了
如果只用yarn, 则把命令里的npm run都改成yarn
—prod 代表production

Proxy

前端项目的baseUrl改成相对地址后,yarn start运行无法正常工作了
image.png
在package.json中添加proxy, 重启应用就可以正常工作了

  1. {
  2. "dependencies": {
  3. // ...
  4. },
  5. "scripts": {
  6. // ...
  7. },
  8. "proxy": "http://localhost:3001"
  9. }

exercise 3.9 - 3.11

如果不能安装heroku cli, 可以使用命令

  1. npx heroku-cli