如何使用Deno,Cloud Run和Cloud Build创建slack命令!

作者 : IT 大叔 本文共5412个字,预计阅读时间需要14分钟 发布时间: 2020-09-24

您可能想知道,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文件夹的需要。很整洁吧?

我们将使用它来导入三个包:

  • 来自本地存储库的bodyParser。注意:这将在以后的帖子中使用。这是从POST请求接收松弛命令所必需的。
  • dotenv获取环境变量。
  • Oak,我们将使用的Web服务器

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请求。您可以使用左上角附近的加号图标创建新请求。
如何使用Deno,Cloud Run和Cloud Build创建slack命令!插图

设置一个名称,将方法从GET设置为POST。并在右侧,将主体设置为JSON。

创建新请求后,请在网址字段中添加以下网址:

http://localhost:8080/

现在,在主体选项卡中,我们必须输入一些数据。
将以下内容粘贴到文本字段中:

{
"text": "hello!"
}

如何使用Deno,Cloud Run和Cloud Build创建slack命令!插图(2)
之后,您可以单击发送,您应该在右侧看到结果!
如果收到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

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论