1

JIRA Webhook をリッスンし、新しいチケットが作成されたときに部屋でアナウンスする Hubot プラグインがあります。

module.exports = (robot) ->
  robot.router.post '/hubot/tickets', (req, res) ->
    data = if req.body.payload? then JSON.parse req.body.payload else req.body
    if data.webhookEvent = 'jira:issue_created'
      console.dir("#{new Date()} New ticket created")
      shortened_summary = if data.issue.fields.summary.length >= 20 then data.issue.fields.summary.substring(0, 20) + ' ...' else data.issue.fields.summary
      shortened_description = if data.issue.fields.description.length >= 50 then data.issue.fields.description.substring(0, 50) + ' ...' else data.issue.fields.description
      console.log("New **#{data.issue.fields.priority.name.split ' ', 1}** created by #{data.user.name} (**#{data.issue.fields.customfield_10030.name}**) - #{shortened_summary} - #{shortened_description}")
      robot.messageRoom "glados-test", "New **#{data.issue.fields.priority.name.split ' ', 1}** | #{data.user.name} (**#{data.issue.fields.customfield_10030.name}**) | #{shortened_summary} | #{shortened_description}"
    res.send 'OK'

これを拡張して、リモート API に対してルックアップを実行したいと思います。基本的に、ルックアップしたい追加情報があり、次に渡すメッセージに追加しますroom.messageRoom。ダイジェストのサポートが必要なので、リクエストを使用しています。

したがって、次のスニペットは単独で問題なく動作します。

request = require('request')

company_lookup = request.get('https://example.com/clients/api/project?name=FOOBAR', (error, response, body) ->
  contracts = JSON.parse(body)['contracts']
  console.log contracts
).auth('johnsmith', 'johnspassword', false)

そして、これが私の JS/Node の新しさが出てくるところです...笑。

コールバック内で応答を処理できますが、そのコールバックの外でアクセスする方法は本当にわかりますか?

そして、これを webhook 処理コードにどのように統合する必要がありますか? スニペットを if ブロック内に移動して、変数に割り当てるだけですか?

4

1 に答える 1

0

ミドルウェアを使用して (Node.js で Express を使用していると仮定します)、company_lookup応答を にreq追加して、ミドルウェアを追加する任意のルートで使用できるようにします。http://expressjs.com/guide/using-middleware.html

例えば:

サーバー.js

var middlewares = require('./middlewares');
module.exports = function (robot) {
    // Tell the route to execute the middleware before continue
    return robot.router.post(middlewares.company_loop, '/hubot/tickets', function (req, res) {
        // Now in the req you have also the middleware response attached to req.contracts
        console.log(req.contracts);
        return res.send('OK');
    });
};

ミドルウェア.js

var request = require('request');
// This is your middleware where you can attach your response to the req
exports.company_lookup = function (req, res, next) {
    request.get('https://example.com/clients/api/project?name=FOOBAR', function (error, response, body) {
        var contracts;
        contracts = JSON.parse(body)['contracts'];
        // Add the response to req
        req.contracts = contracts;
        // Tell it to continue
        next();
    }).auth('johnsmith', 'johnspassword', false);
};
于 2015-09-06T08:00:33.050 に答える