确保应用程序的完整性:学会验证环境在apis node.js中有所不同
#typescript #node #api #fastify

我终于设法完成了我的第一篇文章 dev.to

在第一次尝试交付我失败的东西时

这次我设法使范围关闭,我相信,繁殖是非常幻想的。

入口,足够的语音(或写作...),让我们开始。


¡

我们不会在这里创造任何革命性的或太复杂的东西,已经目的是说明如何验证应用程序上升的必要方差。

对于本教程,我们需要在母亲中安装的Node.js。我还将使用git来处理山雀。亲爱的读者,我将从一开始就开始参加这些借口。

我将MacOS用作操作系统,我将使用终端执行所有命令。如果您使用的是Windows,建议您使用WSL。

我也将yarn用作npm Invents的软件包经理。


我们将在这个项目中使用

  • 打字稿
  • 快速
  • dotenv
  • zod
  • TSX
  • tsup

一个细节:我正在使用fastify,因为我将在此处使用此微型框架发布更多材料。但是我要在这里应用的内容与express或更多的跟踪框架(例如NestJS)完全兼容。


〜开始项目

让我们从创建一个新的env-validate开始。

打开终端并运行命令:

mkdir env-validate && \
cd env-validate

现在,让我们从命令开始一个节点项目:

yarn init -y

已经为git中的委员会做准备,不要上升koud8和.env,让我们在项目的根部创建一个.gitignore文件:

touch .gitignore && \
echo '.env' >> .gitignore && \
echo 'node_modules' >> .gitignore

让我们首先承诺将来促进历史版本的导航。

git add . && \
git commit -m "initial commit" 

â开始快速开始和打字稿

让我们使用Koud4与GET /hello路线启动服务器,以便在此处拥有代码的母亲。

为此,我们将安装koud4:

yarn add fastify

因为我们将使用打字稿,我们将需要已安装的从业者 typecript

我们还需要安装节点(@type/node ),.ts tsx )文件的解释器和javascript的打字稿编译器( tsup )。

yarn add -D typescript @types/node tsx tsup

安装了打字稿,让我们从命令开始启动koud15:

yarn tsc --init 

对于本教程,我们将不需要修改此文件中的任何内容


现在,让我们生成koud16文件,fastify配置为:

mkdir -p src/infra && \
touch src/infra/app.ts

在生成的koud16文件中粘贴以下包含:

import fastify, { FastifyReply, FastifyRequest } from "fastify";

const app = fastify()

app.get('/hello', (request: FastifyRequest, reply: FastifyReply) => {
  return reply.status(200).send({ message: 'hello world' })
})

export { app }

这个文件的方式我们创建了一个常数app,它是fastify函数的实例。

使用此差异app,我们创建了一个GET /hello路线,该路由将返回具有200的“ Hello World”消息。

现在让我们生成koud23文件,这是我们从应用程序中的入口点

touch src/infra/server.ts

粘贴以下在server.ts文件中的包含:

import { app } from "./app";

async function bootstrap() {
  await app.listen({ host: '0.0.0.0', port: 3333 })

  console.log('🚀 server started at port 3333')
}

bootstrap()

解释...

在这里,我们有一个Koud25 Asancrona函数,该功能创建了来自第一行中导入的变体“应用程序”的Koud4服务器。

该服务器在http://localhost:3333

地址上升

但是要使该服务器工作,我们需要将脚本插入Koud28文件。

打开此文件并输入新的scripts键:

"scripts": {
  "start:dev": "tsx watch src/infra/server.ts"
}

爬上服务器,只是在终端运行命令:

yarn start:dev

我们期望在终端看到的是以下消息:

terminal message with fastify server started

一旦服务器从服务器的优美起始消息发送到浏览器,请转到地址:http://localhost:3333/hello

如果一切都正确,这是您应该在浏览器中看到的消息

browser hello world message

要看到这样的格式化消息,我正在使用 dark in Chrome

中的JSON Viewer扩展

新的任务要完成此块

git add . && \
git commit -m "fastify server started"

•验证环境的变体

如果您仍然在终端运行服务器,请使用CTRL + C结束该过程或打开一个新的选项卡/窗口。

现在,让我们生成一个.env文件,在其中我们将列出应用程序启动需要的环境。

touch .env

粘贴以下生成的koud9文件中的包含:

# API_PORT=3333

要验证环境有所不同,让我们使用 验证库,我们还需要安装 dotenv 库。这是最后一个允许我们通过将环境导入到env.ts文件的印度。

来导入环境。

执行不终端:

yarn add zod dotenv 

要创建env.ts文件,请执行:

touch src/infra/env.ts

在生成的文件中粘贴以下包含的内容:

import 'dotenv/config'
import { z } from 'zod'

const envSchema = z.object({
  API_PORT: z.coerce.number()
})

const getEnv = envSchema.safeParse(process.env)

if (!getEnv.success) {
  const errorMessage = 'load environment failed'
  console.error(errorMessage, getEnv.error.format())
  throw new Error(errorMessage)
}

export const env = getEnv.data

让我们传递粘合的内容:

首先,我们导入了koud37来读取koud9文件。接下来,我们从koud39 o z

导入

zod与parano仪表一起使用,在这里我们使用koud40来生成具有应用程序必要差异的schema

在这种情况下,我们声明API_PORT属性为z.coerce.number()

.env文件的环境差异导入的所有内容都解释为文本。使用Koud46之前使用的coerce一词是告诉zodnumber格式进行的对话( string )的一种方式。

接下来,我们创建了一个差异getEnv,我们通过了koud50

koud51 valiala命令如果koud52通过的内容符合koud41中指定的内容。

结果,getEnv的变化将具有.success布尔属性。

下面我们正在检查此.success是否失败,如果失败,我们用错误koud57中断了脚本。

如果验证通过了,也就是说,如果Koud55为True,我们将带有从koud60

获得的数据导出差异env

是测试的时间:

返回到server.ts文件,然后更改port属性以读取前一步中导出的env.API_PORT

server.ts文件将像这样

import { app } from "./app";
import { env } from "./env";

async function bootstrap() {
  await app.listen({ host: '0.0.0.0', port: env.API_PORT })

  console.log(`🚀 server started at port ${env.API_PORT}`)
}

bootstrap()

我利用了优势并修改了控制台消息,以便在终端显示变量中传递的门。

现在让我们运行应用程序以查看发生的情况:

yarn start:dev

e ... eitaiaaa,erro!

平静,预计:)

您可以在终端中看到,我们在执行的顶部有以下错误消息:

terminal env message error

此消息在这里,因为我们创建了带有变量API_PORT的koud9文件。

评论。

要解决此问题,请停止使用Koud32执行服务器,然后返回Koud9文件并删除第一行#。

您的.env.文件应该是这样的:

API_PORT=3333

再次运行应用程序,现在一切都应该工作

yarn start:dev

预期的是,您看到了带有消息的终端:

server started with env environment

我确定(会吗?)一切顺利。

我们将创建一个新的.env.example文件,以便通过克隆此重新定位,可以启动该项目,只是重命名为koud9

cp .env .env.example

e,到最后一个,让我们弥补整个过程,然后去最后一部分。

git add . && \                 
git commit -m "environment variables validated"

生成项目构建

要完成本教程,让我们设置将执行javascript末端的build da aplicação和koud73的脚本。

为此,来到package.json文件,然后添加下面的脚本:

"scripts": {
  ...
  "prebuild": "tsc --noEmit",
  "build": "tsup src --out-dir build",
  "start": "node build/server.js"
}

再次解释...

koud75脚本使用koud76库将打字稿cadigos直接使用koud75作为saãda。

por,在执行transpile之前,会自动调用prebuild,以便仅由于成员而进行thexcript进行跨速度。如果某事失败,则在此阶段中断构建。

如果什么都没有失败,Koud75董事会将带有JavaScript文件,node.js将能够本身执行。

koud73脚本已经使用编译文件执行服务器。

这是如果发布此应用程序,将使用的命令。

要测试所有内容,只需在终端运行:

yarn build

您应该看到类似的东西:

transpile image

现在只运行:

yarn start

并在您的终端上查看...

node execute transpiled code

Pplos沙龙稳固的stuyk它做圆润的玩具吗?

git add . && \                   
git commit -m "app build added"

ufaaa ...

因此结束了我的第一个教程。

该应用程序的任何和所有必要的环境差异都可以在env.ts文件中生成的模式中列出。

因此,如果未在将发布该应用程序的环境中声明其中任何一个。

例如:数据库,AWS或任何其他提供商,JWT代币的变量以及Aãwill。

只需在模式中添加您需要的内容,并保证将在没有任何一个的情况下启动应用程序。

我希望您喜欢它。

访问github的clique aqui

的项目存储库

在下一个;)