将带有 ExpressJS 后端的 React 应用程序从 Heroku 迁移到 Netlify

将带有 ExpressJS 后端的 React 应用程序从 Heroku 迁移到 Netlify

Photo by 克里斯布里格斯 on 不飞溅

Heroku 将开始对 Heroku Dynos 收费,这是运行节点服务器所需的资源。如果您正在开发具有前端和后端的全栈应用程序,则需要升级到付费层或迁移到另一个 Web 平台。

Netlify 是市场上提供慷慨免费等级帐户的最佳选择之一。

但是 Netlify 的后端服务与使用 serverless 功能的 Heroku 有很大不同。不能直接使用相同的后端代码库。

但是只需几个简单的步骤,同一个 React 应用程序就可以立即启动并运行!

从 Heroku 迁移到 Netlify 的步骤

  1. 安装 netlify-lambda无服务器-http

    npm --i netlify-lambda serverless-http

2.在 服务器 目录:

  • 创建一个空 功能 目录——node.js/express 服务器的原始 js/ts 文件默认会内置到“functions”文件夹中

  • 创建一个 源代码 放置后端文件的目录

  • 创建一个 距离 放置所有前端构建文件(HTML、CSS 和 JS)的目录

  • 创建一个 netlify.thumb 文件(详情如下)

  • 更新 包.json 脚本(详情如下)

  • gitignore 以下目录

    节点模块
    功能

3. 修改后端文件(详情如下)

4.将前端应用中的API端点更新为如下路径(默认)

**/.netlify/functions/[文件名]**

您最终将或多或少地得到以下文件结构:

5. 将您的更改推送到在线存储库(例如 github),然后连接到 Netlify 以开始部署您的 Web 应用程序

恭喜!您的应用程序再次免费启动并运行!

netlify.thumb

此文件可用于配置 Netlify 服务器的构建设置、部署设置和环境变量。

至少,我们需要指定两种配置:

  1. 要放入“functions”目录的函数

  2. 将对静态文件的所有请求重定向到允许客户端路由的网站根目录(即使用 React-router 等)

    [建造]
    功能=“功能” [[重定向]]
    来自 = "/*"
    至 = "/"
    状态 = 200

阅读有关 netlify.toml 的更多信息

包.json

不是直接从 Node.js 运行,而是需要模拟该函数以在 Netlify Lambda 上运行,因此我们需要将脚本更改为:

 “脚本”:{ “开始”:“./node_modules/.bin/netlify-lambda 服务源代码”,  
 “构建”:“./node_modules/.bin/netlify-lambda 构建 src” }

更改后端文件

以下是 API 端点的后端文件的基本框架,其文件名 api.js

 常量表达 = 要求(“表达”);  
 常量路由器 = express.Router()  
 **const serverless = require("serverless-http");** 常量应用程序 = 快递(); app.use(express.json()); app.use(/.netlify/functions/ **接口"** ,路由器); router.get("/test", (request, response) => {  
 返回响应。发送(“你好”);  
 }); **module.exports = 应用程序;  
 module.exports.handler = serverless(app);**

端点 /.netlify/functions/api/test 将返回“你好”

常见问题:Node.js 错误

如果您遇到以下错误:

 节点:内部/加密/哈希:71  
 this[kHandle] = new _Hash(算法, xofLen);  
 ^ **错误:错误:0308010C:数字信封例程::不支持**

原因是您正在运行具有更新的 openssl 要求的最新版本的 Node。在这种情况下,您需要将脚本更改为:

 “脚本”:{ "start": "NODE_OPTIONS= - openssl-legacy-provider ./node_modules/.bin/netlify-lambda 服务 src",  
 “构建”:“./node_modules/.bin/netlify-lambda 构建 src” }

常见问题:fetch、node-fetch 和 axios

到目前为止,Netlify 上的 lambda 函数仍未运行本机 javascript fetch 函数。即使您可以在本地环境中毫无问题地运行它,Netlify 的边缘服务器也会抱怨 'fetch' 未定义。

一个流行的替代方案是提供 javascript 提取功能的“node-fetch”模块。但是,node-fetch 2.6 和 node-fetch 3.X 都不适用于 Netlify。你会得到一些奇怪的错误,比如:

 类型错误:e 不是函数  
 类型错误:c 不是函数

这与 Webpack 和 Babel 配置有关。但是解决这个问题的一种简单方法是利用 axios 模块。

只需安装 axios 库并将所有 fetch 更改为 axios 即可。

 fetch(URL, { method: "Get" }).then(...) => axios.get(URL).then(...)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/38856/44142311

posted @ 2022-09-23 11:45  哈哈哈来了啊啊啊  阅读(104)  评论(0编辑  收藏  举报