本教程将演示我偏爱的数据库驱动型Web应用部署工作流程。它面向希望在个人项目中实现全栈开发,而无需设置和维护复杂的多服务基础设施的开发者。 我们将部署一个用Node.js和Express编写的非常基本的Web应用。它允许访问者编写和保存笔记,以及阅读以前编写的笔记。数据存储在MongoDB数据库中。我们将使用GitHub Actions创建一个CIhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712CD工作流程,将我们的应用部署到AWS Lambda上。 重点在于简洁性、实用性和成本节约。由于AWS和MongoDB拥有非常慷慨的免费套餐,您可以免费学习。但是,请记住,如果您不想最终支付几美分,请之后取消部署应用程序。由于您的应用程序将公开可用,因此从长远来看,其使用量理论上可能会超过免费套餐。但是,如果您打算将此应用程序扩展用于您自己的目的,我可以推荐此设置,因为它对于流量适中的网站来说非常经济实惠。 您可以在我们的GitHub帐户上找到本教程的所有代码。 构建应用程序需要一些东西。确保您的系统上已安装Node和Docker。要安装Node,您可以使用Node版本管理器(nvm)(请参阅此处的一些说明)。对于Docker,请为您的操作系统安装最新版本的Docker Desktop。 请注意,我们将使用Docker在我们的机器上运行MongoDB实例。或者,您也可以手动安装MongoDB社区版。您可以在此处找到一些说明。 您还需要在GitHub、MongoDB和Amazon Web Services (AWS)上拥有帐户。在AWS上注册时,您必须输入信用卡号码。如上所述,按照本教程中的步骤不会超过免费套餐。 一些关于Node和Express的预备知识可能会有所帮助。 好的,让我们开始吧。我们首先需要一个带有新package.json文件的空文件夹。如果执行npm init,您可以创建一个。 我们需要安装以下依赖项: 运行以下命令来安装它们:关键要点
先决条件
本地开发
<code class="language-bash">npm install --save express mongoose aws-serverless-express && npm install --save-dev concurrently<https:><https:>
<h3>1. MongoDB和mongoose<https:>
<p>由于我们使用MongoDB数据库来存储我们的数据,因此在本地机器上运行数据库实例对开发很有帮助。这就是我们使用最新<em>mongo<https:> Docker镜像的地方。如果您的机器上安装了Docker,只需在终端中键入docker run mongo即可。该镜像将从dockerhub提取并在新容器中启动。如果您不熟悉Docker,没关系。您只需要知道您的计算机上正在运行一个MongoDB实例,您可以与之通信。<https:>
<p>为了让我们的应用程序与数据库通信,我们需要初始化一个连接。我们在一个名为mongoose.js的新文件中执行此操作。mongoose是帮助我们进行玛格d:<angy>
<https:><pre class="brush:php;toolbar:false">https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 mongoose.js
const mongoose = require(“ mongoose”);
const uri = process.env.mongodb_url;
让连接;
const connect = async()=&gt; {
尝试 {
连接=等待mongoose.createconnection(uri,{
Usenewurlparser:是的,
usefindandModify:false,
UseunifiedTopology:是的,
BufferCommands:false,https://www.php.cn/link/29A9F8C8460E5E2BE4EDDE57FD83712HTTPS://wwwww.php.cn/www.php.cn/29a9a9a9f8c8460e771nong nong ablefermose mbulder
buffermaxentries:0,https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.p.cn/link/29a9a9f8c8460e555555555555555555555555555555555555555555555555555。
});
返回连接;
}捕获(e){
Console.Error(“无法连接到Mongodb ...”);
扔e;
}
};
函数getConnection(){
返回连接;
}
Module.exports = {Connect,getConnection};<code class="language-javascript"><https:>>
<https:>此文件导出一个包含两个函数的对象。connect()创建一个到我们环境变量中指定位置的mongodb的连接。该连接存储在一个名为连接的变量中。GetConnection()只是返回连接变量。您可能想知道为什么我们不直接返回连接变量本身。这是因为node.js在第一次加载后会缓存所需的模块。因此连接变量。<p>
<https:>现在我们的应用程序能够连接到数据库>,我们也希望在其中存储数据> - 更具体地说,是我们可以在用户界面中编写的笔记。因此,我们将为我们的笔记创建一个数据模型,我们将为我们的笔记创建一个数据模型。这在型号文件夹内名为注释
<p> <https:> https://www.php.cn/link/link/29a9f8c8460e5e2be4edde557fd83712https://wwwww.php.cn/29a9a9f8c8460e5e555.2beppps:<pre class="brush:php;toolbar:false"> CN/Link/29A9F8C8460E5E2BE4EDDE557FD83712NOTES.JS
const mongoose = require(“ mongoose”);
const {getConnection} = require(“ ..https://www.php.cn/link/link/29a9f8c8460e5e5e2be4edde557fd83712mongoose”);
const conn = getConnection();
const schema = mongoose.schema;
Module.exports = Conn.Model(
“笔记”,
新模式({text:{type:string,必需:true}})
);<code class="language-javascript"><https:>
<https:>在这里>,我们从angoose.js模块中提取当前连接,并在其上注册一个名为。使用此模型,我们可以构造存储在数据库中的文档。<https:>
<h3>2. Express应用程序<https:>
<p>接下来,我们创建一个简单的Express应用程序。在项目根目录中创建一个名为app.js的文件。它具有以下内容:<https:>
<pre class="brush:php;toolbar:false"><code class="language-javascript">https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 app.js
const express = require(“ express”);
const app = express();
app.use(express.urlencoded({extended:false}));
app.get(“ https://www.php.cn/link/29a9f8c8460e5e2be4edde57fd83712”,async(req,res)=&gt; {{
尝试 {
const Note = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712modelshttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712Note");
const注释=等待note.find({});
返回res.status(200)。
`
<style>
html {
文字平衡:中心;
背景色:#93C5FD;
字体家庭:“ Segoe UI”,Tahoma,Geneva,Verdana,Sans-Serif;
颜色:白色;
字体大小:2REM;
}
textarea {
调整大小:无;
边界:2PX实心#9CA3AF;
边界拉迪乌斯:4PX;
背景色:#f3f4f6;
填充:0.5REM;
宽度:90%;
}
按钮 {
左填充:2REM;
夹右:2REM;
填充:7px;
填充底:7px;
背景色:#f3f4f6;
边界:2PX实心#9CA3AF;
颜色:#4B5563;
边界拉迪乌斯:4PX;
}
p {
边界底:2px固体;
填充:1REM;
文本平衡:左;
}
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712style>
<form method="POST">
<textarea name="text"><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712textarea> <br>
<button type="submit">>保存<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712button>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712form>
<h1>我的笔记<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h1>
美元
`
);
}捕获(e){
返回res.send(e);
}
});
app.post(“ https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712”,async(req,res)=&gt; {{
尝试 {
const Note = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712modelshttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712Note");
const注释= new Note(req.body);
等待注释。Save();
return res.send(“ note保存。
}捕获(e){
返回res.send(e);
}
});
module.exports = app;<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p>如我所说,该应用程序非常简陋,仅用作演示。首先,我们启动一个Express应用程序。然后,我们告诉它为我们解析传入的请求正文,使用内置的urlencoded中间件,以便能够使用提交的表单数据。该应用程序对应用程序根目录上的请求有两个方法处理程序:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<ul>
<li>
<p>app.get("https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712", ...)处理HTTP GET请求。当我们的用户加载页面时,它会被调用。我们想要向他们展示一个简单的页面,他们可以在其中键入笔记并保存它。此外,我们还希望显示以前编写的笔记。在请求处理程序的回调函数中,我们需要我们的Note模型。该模型必须在我们的POST请求处理程序的回调函数内被需要,因为它需要一个当前的数据库连接——当app.js文件第一次加载时,该连接可能不存在。然后,我们应用find方法来接收数据库中的所有笔记。此方法返回一个promise。因此,我们等待它解析。最后但并非最不重要的是,我们使用响应对象(res)的send方法将字符串发送回客户端。该字符串包含浏览器呈现为实际HTML元素的HTML语法。对于我们数据库中的每个笔记,我们只需添加一个包含其文本的段落元素。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>这是您可以将这个非常简陋的示例转换为漂亮的用户界面的地方。您可以自由选择发送给客户端的内容。例如,这可能是完全捆绑的客户端React应用程序。您也可以选择服务器端呈现的方法——例如,通过使用像Handlebars这样的Express视图引擎。根据它是什么,您可能需要向您的应用程序添加更多路由并提供静态文件,如JS包。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712li>
<li>
<p>app.post("https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712", ...)处理HTTP POST请求。当用户保存他们的笔记时,它会被调用。同样,我们首先需要我们的Note模型。请求有效负载可以通过请求对象(req)的body属性访问。它包含用户提交的文本。我们用它来创建一个新文档并使用Mongoose提供的save方法保存它。同样,我们等待此异步操作完成,然后通知用户并给他们刷新页面的可能性。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712li>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712ul>
<p>为了让我们的应用程序真正开始监听HTTP请求,我们必须调用Express提供的listen方法。我们将在添加到项目根目录的单独文件dev.js中执行此操作:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<pre class="brush:php;toolbar:false"><code class="language-javascript">https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 dev.js
const app = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712app");
const { connect } = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712mongoose");
connect();
const port = 4000;
app.listen(port, () => {
console.log(`app listening on port ${port}`);
});<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p>在这里,我们调用mongoose.js文件中的connect函数。这将启动数据库连接。最后但并非最不重要的是,我们开始监听端口4000上的HTTP请求。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>使用两个单独的命令启动mongo Docker镜像和我们的应用程序有点麻烦。因此,我们将一些脚本添加到我们的package.json文件中:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<pre class="brush:php;toolbar:false"><code class="language-json">"scripts": {
"start": "concurrently 'npm:mongoDB' 'npm:dev'",
"dev": "MONGODB_URL=mongodb:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712localhost:27017 node dev.js",
"mongoDB": "docker run -p 27017:27017 mongo"
}<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p>mongoDB启动一个MongoDB实例,并将容器端口27017映射到本地机器的端口27017。dev启动我们的应用程序,并设置在mongoose.js文件中加载的环境变量MONGODB_URL,以便与我们的数据库通信。start脚本并行执行这两个脚本。现在,我们只需要在终端中运行npm start即可启动我们的应用程序。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>您现在可以通过在浏览器中访问http:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712localhost:4000来加载应用程序。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="/static/imghwm/default1.png" data-src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284121297.jpg" class="lazy" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h2><strong>部署<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712strong><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h2>
<p>现在是部署我们的应用程序的时候了。我们将使用AWS上的Lambda函数、MongoDB Atlas和AWS API Gateway来实现。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>1. 什么是Lambda函数?为什么我们要使用它们?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>Lambda函数是一种响应HTTP请求执行代码的方式,无需维护服务器。它们仅按需运行,这意味着如果没有人调用您的服务,您无需支付服务器时间费用。另一方面,如果许多人调用您的服务,AWS会自动扩展,并且会启动更多Lambda实例。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>顾名思义,Lambda函数是函数,您可以用任何您想要的内容填充它们。只有一个例外:您的代码不应该有状态,因为Lambda实例一旦不再执行就会关闭。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>我们将整个应用程序包装在一个Lambda函数中,并将其部署到AWS Lambda上。AWS Lambda有一个非常慷慨的、无限的免费套餐,包括每月一百万次免费请求和400,000 GB秒!因此,您可以安全地试验该服务并部署多个Lambda函数,而无需为此付费。请记住,如果您不想再使用它们,请删除这些函数。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>2. 创建AWS Lambda函数<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>现在,登录到您的AWS管理控制台并导航到AWS Lambda。在<em>函数<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>部分下,单击<em>创建函数<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。在此之前,重要的是您已指定要部署服务的区域。在台式计算机上,您可以在管理控制台的右上角选择一个区域。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>选择<em>从头开始创作<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>并为您的函数命名。我将其命名为<em>express-lambda-example<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。在<em>运行时<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>下,选择<em>Node.js 12x<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>,然后创建函数。您将看到一个如下所示的窗口:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="/static/imghwm/default1.png" data-src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284443353.jpg" class="lazy" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>我们的Lambda函数已经包含了一些测试代码。您可以忽略这一点,因为我们稍后会覆盖它。如果您向下滚动页面,您将看到一个名为<em>环境变量<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>的部分。记住,在我们之前的本地开发脚本中,我们定义了一个名为MONGODB_URL的变量?我们必须在这里创建相同的变量,以便我们的Lambda实例能够与我们的数据库通信。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>但是,我们还没有运行数据库。我们不想为此目的使用我们的本地机器。这就是为什么我们将创建一个MongoDB Atlas免费套餐集群。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>3. 设置MongoDB Atlas云服务<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>要创建免费套餐集群,请在mongodb.com上创建一个帐户。在注册过程中,系统会要求您选择集群类型。选择免费的<em>共享集群<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。下一步是为您的项目命名。此外,您可以选择您喜欢的编程语言。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>在下一步中,您可以选择云提供商和区域。由于我们已经将AWS用于我们的Node.js应用程序,因此我建议您选择它,如果可能的话,选择您之前在AWS上选择的相同区域。在下一节中,您可以决定要使用哪个层级。选择<em>M0 Sandbox<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>层级。MongoDB不建议在生产环境中使用此层级,但对于初学者来说,它将提供您需要的一切。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="/static/imghwm/default1.png" data-src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284592009.jpg" class="lazy" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>几分钟后,我们的集群就可以使用了。现在唯一缺少的是对它的访问。单击菜单中的<em>数据库访问<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>并创建一个新用户。身份验证方法是<em>密码<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。授予用户读写权限。完成此操作后,我们需要将可以访问我们数据库的IP地址列入白名单。您可以在<em>网络访问<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>部分下执行此操作。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>不幸的是,我们不知道每个尝试连接到我们集群的Lambda实例的IP。因此,我们将通过添加0.0.0.0https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd837120来将任何IP地址列入白名单。请注意,如果您有敏感数据并希望确保高度的数据保护,则不建议这样做。我们的集群现在仅受我们赋予数据库用户的凭据保护。设置对等连接将是解决此问题的可能解决方案。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>现在,返回您的集群并单击<em>连接<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。在弹出的模式窗口中,单击<em>连接您的应用程序<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。然后,选择Node.js版本2.2.12或更高版本并复制连接字符串。回到我们在AWS上的Lambda函数控制台中,创建一个名为MONGODB_URL的新环境变量,并将连接字符串粘贴进去。确保用数据库用户的凭据和数据库的名称替换字符串中的占位符。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>4. 使您的应用程序准备好用于AWS Lambda<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>为了让AWS Lambda能够调用我们的应用程序,我们必须设置一个新的入口脚本,类似于我们在dev.js文件中所做的。我们将将其命名为index.js,它具有以下内容:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<pre class="brush:php;toolbar:false"><code class="language-javascript">https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 index.js
const awsServerlessExpress = require("aws-serverless-express");
const { connect } = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712mongoose");
let connection = null;
module.exports.handler = async (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
if (connection === null) connection = await connect();
const app = require(".https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712app");
const server = awsServerlessExpress.createServer(app);
return awsServerlessExpress.proxy(server, event, context, "PROMISE").promise;
};<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p>在这里,我们使用aws-serverless-express库。它基本上与dev.js中的listen方法具有相同的功能。它允许我们的应用程序在Lambda环境中处理客户端请求。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>现在,关于我们的lambda.js文件有一件重要的事情需要注意。每次调用Lambda函数时,都会执行handler函数。handler函数之外的所有内容都在Lambda容器启动时启动一次,并且可能在多个Lambda调用之间持续存在。这就是我们将MongoDB连接对象存储在文件全局范围内的原因。每次handler函数运行时,它都会检查是否已经启动了连接。如果是,则函数会重用它,而不是每次都重新连接到数据库。这非常重要,因为它节省了大量执行时间。为了使连接在多个调用中持续存在,我们需要将context.callbackWaitForEmptyEventLoop设置为false。您可以在此处阅读有关此功能的更多信息。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>5. 使用GitHub Actions部署到AWS Lambda<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>下一步是使用GitHub Actions创建CIhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712CD工作流程。这意味着每次我们将代码更改推送到GitHub存储库时,我们都希望触发一个管道。该管道会自动处理更新我们在AWS上的Lambda函数。Jakob Lind在他的文章“如何设置AWS Lambda和使用Github Actions进行自动部署”中对这个过程进行了很好的描述。我将简要总结主要部分。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>为了让GitHub设置并启动工作流程,我们在路径https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712.githubhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712workflows中创建一个名为deploy.yml的文件。yaml:<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<pre class="brush:php;toolbar:false"> <code class="language-yaml">#https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712.githubhttps:///www.php.cn/www.php.cn/link/29a9f8c8c84460eplfloffllflow sherfloffyshyflflowshyplfloffllflow sherflflow sherflflowsnypn4pperfdy555555555555 ww.php.cn/link/29a9f8c8460e5e2be4edde557fd83712deploy.yml
名称:部署到lambda
在:
推:
分支:
- 主要的
工作:
部署:
名称:部署
战略:
矩阵:
节点交换:[12.x]
运行:ubuntu-latest
步骤:
- 用途:Actionhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712checkout@v1
- 名称:设置nodejs
用法:ActionHttps://www.php.cn/link/29A9F8C8C8460E5E2BE4EDDE57FD83712SETUP-NODEUP-NODE@V1
和:
node-version:$ {{matrix.node-version}}
- 名称:NPM安装
运行:NPM CI-生产
- 名称:zip
用途:montudorhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712Action-zip@v0.1.1
和:
args: zip -qq -r .https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712app.zip .https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712
- 名称:推到Lambda
用途:AppleBoyhttps://www.php.cn/link/29A9F8C8C8460E5E2BE4EDDE57FD83712LAMBDA-ACTACH@MASTER@Master
和:
AWS_ACCESS_KEY_ID:$ {{necrets.aws_access_key}}
AWS_SECRET_ACCESS_KEY:$ {{secrets.aws_secret_key}}
AWS_REGION:欧盟central-1#请替换为您的aws区域
function_name:express-lambda-example
zip_file:app.zip <https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712code><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712pre>
<p> github动作在每次推送到存储库的主分支时执行一个名为部署的作业。对我来说,将其仅限于主分支非常有用。因此,您可以安全地推送到您的开发分支,而不会将不需要的代码部署。>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>>部署作业只是安装所有必要的库,将整个项目压缩,并将其推送到aws lambda。请注意,yaml文件需要通过环境变量访问aws访问密钥:aws_access_keyy和aws_secret_keykey。您可以通过在的身份和访问管理控制台中创建新用户来生成这些密钥。获得密钥后,您需要将它们另存为github项目设置下的环境变量,位于> secrets<p><<em>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>要使您的应用程序在要使您的应用程序在
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>6。 AWS API网关使我们的应用程序可访问<p>
<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>现在我们的应用程序已准备好用于实时环境。但是,我们没有通过web访问它的方法。这就是我们接下来使用aws api网关请注意,API Gateway也有一个免费套餐。但是,此套餐仅限于12个月。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>在您的AWS控制台中,导航到API Gateway服务并单击<em>创建API<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>,选择<em>REST API<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>,为其命名并保存。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>要将API Gateway连接到我们的Lambda函数,我们创建一个新的方法,将任何HTTP请求转发到我们的Lambda函数。因此,在<em>操作<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>下拉菜单中,选择<em>创建方法<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>并选择<em>ANY<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>。您应该会看到一个如下图所示的屏幕。确保选中<em>使用Lambda代理集成<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>复选框。输入Lambda函数的名称并保存。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="/static/imghwm/default1.png" data-src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284649066.jpg" class="lazy" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>接下来,我们必须设置Lambda代理集成。这基本上意味着所有客户端请求都应按原样重定向到我们的Lambda函数。因此,我们在<em>操作<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>下拉菜单中创建一个新的资源。在弹出的模式窗口中,选中<em>配置为代理资源<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>复选框(见下文)并保存。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p><img src="/static/imghwm/default1.png" data-src="https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712img.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712uploadhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712articlehttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712000https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712173916284977045.jpg" class="lazy" alt="A Guide to Serverless Deployment with Express and MongoDB " https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>这将创建另一个我们必须与Lambda函数连接的方法。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>最后但并非最不重要的是,我们通过在<em>操作<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>下拉菜单中选择<em>部署API<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>来部署我们的API。在弹出的窗口中,选择<em>[新阶段]<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>,为阶段命名并部署它。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>就是这样。您可以通过单击在已创建阶段的<em>阶段编辑器<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>中找到的<em>调用URL<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>来访问我们的应用程序。<em>调用URL<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712em>是映射到我们的API Gateway的公共URL。当然,您也可以使用自定义域来执行此操作。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h2><strong>结论<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712strong><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h2>
<p>您会看到,部署需要数据库的更复杂的应用程序并不一定很困难。当然,我向您展示的工作流程远非完美,并且缺乏大型应用程序从长远来看所需的许多功能。但对我来说,它已被证明对于流量低和适中的网站来说是简单、实用且经济的。我使用了非常相似的技术栈来构建和部署JSchallenger。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<p>如果您有任何想法或评论,请通过Twitter联系:@kueckelheim。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h2><strong>关于使用Express和MongoDB进行无服务器部署的常见问题解答(FAQ)<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712strong><https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h2>
<h3>使用Express和MongoDB进行无服务器部署有哪些好处?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>使用Express和MongoDB进行无服务器部署具有多种优势。首先,它允许开发人员专注于编写代码,而无需担心服务器管理。这是因为无服务器架构会自动为您管理服务器。其次,它具有成本效益,因为您只需支付您消耗的计算时间。当您的代码未运行时,不会收取任何费用。第三,无服务器部署会根据您的工作负载大小自动扩展。这意味着您的应用程序可以随着需求的增加而处理更多请求,而无需任何手动干预。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何调试我的无服务器应用程序?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>由于其分布式性质,调试无服务器应用程序可能有点棘手。但是,您可以使用多种方法来调试您的应用程序。最常用的方法之一是使用日志记录。您可以记录有关应用程序执行的重要信息,然后分析这些日志以查找任何问题。另一种方法是使用分布式跟踪工具,如AWS X-Ray。这些工具提供有关应用程序性能和瓶颈发生位置的见解。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>我可以在无服务器应用程序中使用Express中间件吗?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>是的,您可以在无服务器应用程序中使用Express中间件。Express中间件函数是可以访问请求对象(req)、响应对象(res)和应用程序请求-响应周期中的下一个中间件函数的函数。这些函数可以执行任何代码,更改请求和响应对象,结束请求-响应周期,并调用下一个中间件函数。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何保护我的无服务器应用程序?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>保护无服务器应用程序涉及多个步骤。首先,您应该遵循最小权限原则。这意味着您应该只向您的函数授予必要的权限。其次,您应该在静态和传输过程中加密敏感数据。第三,您应该定期更新您的依赖项,以避免任何已知的漏洞。最后,您应该监控您的应用程序是否有任何异常活动。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何在本地测试我的无服务器应用程序?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>可以使用Serverless Offline等工具在本地测试无服务器应用程序。此工具在您的本地机器上模拟AWS Lambda和API Gateway,允许您测试无服务器应用程序,而无需部署它。您还可以使用Jest等单元测试框架来测试您的单个函数。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何监控我的无服务器应用程序?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>可以使用各种工具来监控无服务器应用程序。AWS提供了一些监控工具,如CloudWatch和X-Ray。CloudWatch为您提供数据和可操作的见解,以监控您的应用程序,了解并响应系统范围的性能变化,优化资源利用率,并获得操作状况的统一视图。X-Ray帮助开发人员分析和调试生产分布式应用程序,例如使用微服务架构构建的应用程序。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何处理无服务器应用程序中的错误?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>可以在代码中使用try-catch块来处理无服务器应用程序中的错误。您还可以使用中间件函数来处理错误。此外,AWS Lambda会自动重试两次失败的Lambda函数,您可以配置其他重试。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何优化无服务器应用程序的性能?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>优化无服务器应用程序的性能涉及多个步骤。首先,您应该为您的函数选择合适的内存大小。其次,您应该最小化部署包大小以减少冷启动时间。第三,您应该使用连接池来重用数据库连接。最后,您应该使用缓存来减少数据库调用的次数。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>我可以将MongoDB Atlas与无服务器应用程序一起使用吗?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>是的,您可以将MongoDB Atlas与无服务器应用程序一起使用。MongoDB Atlas是由构建MongoDB的同一人开发的完全托管的云数据库。它提供了一种简单的方法来在您选择的云上部署、操作和扩展MongoDB。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p>
<h3>如何将我现有的Express应用程序迁移到无服务器架构?<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712h3>
<p>将现有的Express应用程序迁移到无服务器架构涉及多个步骤。首先,您应该将您的应用程序重构为更小、无状态的函数。其次,您应该替换任何与无服务器架构不兼容的中间件。最后,您应该彻底测试您的应用程序,以确保它在无服务器环境中正常工作。<https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712p></style></code>
以上是Express和MongoDB无服务器部署指南的详细内容。更多信息请关注PHP中文网其他相关文章!