如何使用Deno,Cloud Run和Cloud Build创建slack命令!
您可能想知道,Deno到底是什么?Deno是一个运行时环境。很像Node.js。实际上,它是由制作Node.js的同一人Ryan Dahl创建的。Ryan希望纠正他在Node.js上犯的错误。他在2018年的一次演讲中谈到了自己的遗憾,我为Node.js感到遗憾的十件事可以在这里随意查看。
它可以同时运行Typescript和Javascript。Typescript开箱即用!不需要任何设置。我是Typescript的忠实粉丝,因此很高兴看到。
入门:
首先是第一件事,我们需要安装Deno。
完成后,请随时打开终端并进行测试。
deno --version
现在,为了使该特定项目中的事情顺利运行。我们将必须安装特定版本的Deno。Deno发展迅速,很多时候,最新版本的Deno不能与最新版本的软件包一起使用。因此,保留特定版本可确保一切正常。话虽如此,我们将要安装版本1.3.2
deno upgrade --version 1.3.2
deno --version
确保deno很好,我们已经准备好继续前进!
另外,我正在使用yarn(Node.JS程序包管理器)。但是,我仅将其用于运行脚本。因此不需要安装它,但是很方便。
码:
让我们开始吧!让我们从一个简单的服务器开始。
创建一个名为main.ts的文件,并添加以下代码位:
import {Application, Router} from 'https://deno.land/x/oak@v6.0.1/mod.ts';
import bodyParser from './body-parser.ts';
import 'https://deno.land/x/dotenv/mod.ts';
const app = new Application();
const PORT = Deno?.env?.get('PORT') ?? 8080;
const router = new Router();
/**
* Submit text to be shouted
*
* @example
* curl -X POST "https://localhost:8080/" --data '{"text":"TEST"}'
* https://api.slack.com/interactivity/slash-commands#app_command_handling
* @param {object} req request object.
* @param {object} req.body The request payload.
* @param {string} req.body.text The user's text.
* @param {object} res response object.
*/
router
.post('/', async (context) => {
try {
// Get the Body:
const body = await context.request.body();
if (!context.request.hasBody) {
context.response.status = 400;
context.response.body = {
success: false,
message: 'No data provided',
};
return;
}
const json = await context.request.body({type: "json"}).value;
const result = await FetchShoutCloud(json.text! as string);
context.response.status = 200;
context.response.type = 'application/json';
context.response.body = {
'text': `${result}`,
};
return;
} catch (error) {
console.error(error);
context.response.status = 500;
return;
}
});
async function FetchShoutCloud(command: string): Promise<string> {
const data = await (await fetch('HTTP://API.SHOUTCLOUD.IO/V1/SHOUT', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({'INPUT': command}),
})).json();
return data.OUTPUT;
}
app.use(router.routes());
app.use(router.allowedMethods());
app.addEventListener("listen", ({hostname, port, secure}) => {
console.log(
`Listening on: ${secure ? "https://" : "http://"}${
hostname ?? "localhost"
}:${port}`
);
})
await app.listen({port: Number(PORT)});
export default app;
糟糕,这是很多代码!让我们分解一下这段代码,以便我们了解这里发生的事情。
import {Application, Router} from 'https://deno.land/x/oak@v6.0.1/mod.ts';
import bodyParser from './body-parser.ts';
import 'https://deno.land/x/dotenv/mod.ts';
const app = new Application();
const PORT = Deno?.env?.get('PORT') ?? 8080;
const router = new Router();
在文件的最顶部,我们需要导入一些软件包。
传统上,使用Node.JS或诸如React或Angular之类的前端应用程序时,将需要package.json,并将其依赖项下载到node_packages文件夹中。该项目将使用这些文件来利用任何包。但是,package.json或node_packages内完全没有依赖项。那么Deno怎么做到的?另外,为什么从URL而不是从包文件夹导入的包的位置呢?
简而言之,deno 没有软件包管理器。它从该URL下载程序包(有时具有特定版本),并将程序包缓存到全局目录中。减少了您需要处理的每个项目的庞大的node_packages文件夹的需要。很整洁吧?
我们将使用它来导入三个包:
Oak本质上是Node JS Koa框架的Deno版本。因此,如果您以前使用过此功能,那么您将在一个熟悉的地方。无论如何,这是一个初学者友好的框架。
接下来的几行我们将启动Oak应用程序。之后,我们将创建一个路由器,该路由器将创建中间件,该中间件使我们能够创建路由(基于请求的路径名)。
router
.post('/', async (context) => {
try {
// Get the Body:
const body = await context.request.body();
if (!context.request.hasBody) {
context.response.status = 400;
context.response.body = {
success: false,
message: 'No data provided',
};
return;
}
const json = await context.request.body({type: "json"}).value;
const result = await FetchShoutCloud(json.text! as string);
context.response.status = 200;
context.response.type = 'application/json';
context.response.body = {
'text': `${result}`,
};
return;
} catch (error) {
console.error(error);
context.response.status = 500;
return;
}
});
async function FetchShoutCloud(command: string): Promise<string> {
const data = await (await fetch('HTTP://API.SHOUTCLOUD.IO/V1/SHOUT', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({'INPUT': command}),
})).json();
return data.OUTPUT;
}
我们将实现的一种方法是对基本URL的POST请求。我们将获取请求的正文。如果没有正文,我们将返回错误。如果有正文,我们将解析内容,并将结果传递到名为ShoutCloud的API上。他们处理请求的大写。最后,我们从该API请求中获取结果,并以JSON响应的形式返回结果。
如果在此过程中发生任何事情,它将抛出一个错误,并返回500错误。
上下文是什么意思?上下文表示正在通过Oak中间件的当前请求。当您有多个中间件功能通过时,它非常有用。
app.use(router.routes());
app.use(router.allowedMethods());
app.addEventListener("listen", ({hostname, port, secure}) => {
console.log(
`Listening on: ${secure ? "https://" : "http://"}${
hostname ?? "localhost"
}:${port}`
);
})
await app.listen({port: Number(PORT)});
export default app;
最后,我们必须告诉Oak应用程序使用路由器中间件。我们将返回执行所有路由处理的中间件。第二行将处理允许的方法。如果没有路由处理特定方法,则将返回405错误!这意味着如果用户尝试使用GET请求而不是POST请求,则会收到405错误。
下一个块对我们来说更多,那就是应用程序启动并开始侦听请求的时间。我们将在控制台上获得一些反馈,了解是否需要该应用程序。
最后,应用程序开始侦听请求!
运行:
我们就快到了。现在该运行文件了!
输入命令:
deno run --allow-env --allow-net ./main.ts
默认情况下,Deno在沙盒环境中工作。这意味着默认情况下它没有任何权限,除非您明确允许这些权限。在这种情况下,我们允许两个权限:
- --allow-env:允许我们访问环境变量。
- --allow-net:允许我们访问互联网
它应该在您的终端中看到该应用程序正在localhost:8080 /上侦听
它已经启动并运行了!
测试:
现在我们开始运行它,让我们对其进行测试!但是,我们如何测试POST请求?我们可以通过终端执行此操作,但让事情变得更加简单。
让我们使用一个名为Insomnia的API资源管理器。特别是失眠症的核心。这是探索静态API和GraphQL API的简便方法。
安装完成后,将其打开并创建一个新的POST请求。您可以使用左上角附近的加号图标创建新请求。
设置一个名称,将方法从GET设置为POST。并在右侧,将主体设置为JSON。
创建新请求后,请在网址字段中添加以下网址:
http://localhost:8080/
现在,在主体选项卡中,我们必须输入一些数据。
将以下内容粘贴到文本字段中:
{
"text": "hello!"
}
之后,您可以单击发送,您应该在右侧看到结果!
如果收到500错误,请确保您的应用程序已打开!如果收到403错误,请确保您的网址正确。
如果一切顺利,您应该可以看到您的文字!干得好!
关于迪诺的想法:
Deno v1.0.0于2020年5月12日发布。经过2年的开发,它处于稳定状态。话虽如此,仍然有很多成长的烦恼。
Deno和许多受欢迎的软件包都在快速增长和迭代。Deno有很多特定版本,您需要安装特定版本的软件包,否则应用程序将因Deno中的类型错误而无法编译。这部分非常令人困惑,并且进行了大量研究以找出哪个版本与哪个版本兼容。
总体而言,Deno确实很整洁。我还没有看到它能超越Node.js,尤其是因为事情正在以迅雷不及掩耳的速度快速发展,而且事情还不太稳定。但是,将来我一定会在生产项目中使用它。社区正在发展,我不介意与之分开。Deno的贡献者和社区很高兴回答了我在这个项目中遇到的所有问题。
也许Deno将成为下一个标准。只有时间可以证明。
结论:
这就是第一部分的全部内容。在接下来的部分中,我们将:
- 使用Cloud Run启动并运行。
- 设置一个Slack开发者帐户和Slack应用程序
- 最后,使用云构建自动化部署。
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » 如何使用Deno,Cloud Run和Cloud Build创建slack命令!
常见问题FAQ
- 没有金币/金币不足 怎么办?
- 本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
- 所有资源普通会员都能下载吗?
- 本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。