【问题标题】:Rocket.Chat WebHook with TypescriptRocket.Chat WebHook 与 Typescript
【发布时间】:2020-07-04 00:44:08
【问题描述】:

我即将为 Rocket.Chat 编写一个复杂的 Incoming WebHook。为了避免单个文件混乱,我使用了 Typescript。 Rocket.Chat 需要一个名为 Script 的类以及一些预定义的方法,例如 process_incoming_request(一个简单的例子:https://rocket.chat/docs/administrator-guides/integrations/)。

我当前的项目设置如下:

tsconfig.ts

{
  "files": [
    "src/main.ts"
  ],
  "compilerOptions": {
    "noImplicitAny": true,
    "target": "es2015"
  }
}

gulpfile.js

var gulp = require("gulp");
var browserify = require("browserify");
var source = require("vinyl-source-stream");
var tsify = require("tsify");
var uglify = require("gulp-uglify");
var buffer = require("vinyl-buffer");

gulp.task(
    "default",
    function () {
        return browserify({
            basedir: ".",
            debug: true,
            entries: ["src/main.ts"],
            cache: {},
            packageCache: {}
        })
            .plugin(tsify)
            .transform("babelify", {
                presets: ["es2015"],
                extensions: [".ts"]
            })
            .bundle()
            .pipe(source("bundle.js"))
            .pipe(buffer())
            .pipe(uglify())
            .pipe(gulp.dest("dist"));
    }
);

ma​​in.ts

import {RequestInterface} from "./Interface/RequestInterface";

class Script {
    process_incoming_request(request: RequestInterface) {
        // some code
    }
}

yarn gulp 进程运行顺利,没有错误,但是在 webhook 的脚本部分中使用生成的代码时会导致错误:

Incoming WebHook.error script.js:1   
ReferenceError: module is not defined       
at script.js:1:4307       
at Script.runInContext (vm.js:127:20)       
at Script.runInNewContext (vm.js:133:17)       
at getIntegrationScript (app/integrations/server/api/api.js:70:12)       
at Object.executeIntegrationRest (app/integrations/server/api/api.js:166:13)       
at app/api/server/api.js:343:82       
at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1234:12)       
at Object._internalRouteActionHandler [as action] (app/api/server/api.js:343:39)       
at Route.share.Route.Route._callEndpoint (packages/nimble_restivus/lib/route.coffee:150:32)       
at packages/nimble_restivus/lib/route.coffee:59:33 

我对 Typescript、Node 和所有东西都不是很熟悉。所以主要的问题是,我怎样才能使用方法process_incoming_request 生成一个名为Script 的类(或公开类的脚本)。我也不确定我的脚本是生成错误还是 RocketChat 部分。

谢谢!

【问题讨论】:

  • 似乎有一些您没有发送给我们的代码导致了错误。您的 script.js 文件中有什么内容?
  • Rocket.Chat 集成中引发了script.js 错误,它不是我脚本的一部分。
  • Rocket.Chat集成你是指Rocket.Chat的在线编辑器吗?或者您有部署代码的服务器吗?
  • 正是在线编辑器

标签: javascript typescript rocket.chat


【解决方案1】:

我猜问题是 Gulp(或它的一些插件)生成了一个脚手架代码,这是 JS(不存在的)模块系统所必需的,它通常意味着将编译器输出包装到奇怪的多层匿名函数中。

如果您不需要任何类型的模块系统,并且只想将多个 TS 文件直接翻译成单个 JS 文件(据说该文件会转到 RocketChat),那么我建议完全放弃 Gulp,让 TSC 编译您的代码像往常一样,然后将生成的 .js 文件与脚本捆绑到一个单独的文件中。

因此,整体设置如下(假设src 是一个源代码文件夹):

tsconfig.json

{
  "include": [
    "src/**/*.ts"
  ],
  "compilerOptions": {
    "noImplicitAny": true,
    "target": "es2016"
  }
}

build.sh

#!/bin/bash

# TSC puts compiled JS files along with their TS sources. 
node_modules/typescript/bin/tsc

# Creating an empty bundle file.
echo "">dist/app.js

# Bundling all the JS together.
# sed removes the 'export' keywords & 'import' statements.
while read p; do
  cat $p | sed -E "s/^export\s+(class|function|async|const|var)/\1/" | sed -E "s/import.*$//" >> dist/app.js
done <<< $(find src -type f -name "*.js")

所以你像往常一样编程你的东西,用./build.sh构建它,获取dist/app.js文件并在RocketChat中使用它。

在 Gulp 中一定有一种方法可以按照这些方式做一些事情,但我不熟悉它,并且认为这里不需要一个完整的构建系统。

【讨论】:

  • 好主意,我稍后试试!谢谢。
  • 抱歉回复晚了..基本上它工作正常。您知道如何摆脱导出和导入语句吗? Example
  • 很遗憾,没有exports 就无法编译 TS,但可以在捆绑期间剥离它们。我更新了构建脚本以删除导出语句,但要注意多行字符串文字 - 如果您的字符串中有一行以 export class yada yada 开头,它也会被删除。 Sed 对 JS 毫无概念。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多