質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

Slackでダイアログを表示するが送信後に閉じられない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,971

score 447

SlackでDialogをだしたのですが、送信ボタンを押しても再試行してくださいとでてしまいます。送信を押すたびにsubmissionにDialogの情報が与えられるので、Dialogを閉じたいのですが参考の意見がいただきたいです。

require('dotenv').config();
const { WebClient } = require('@slack/client')
const token = process.env.SLACK_CLIENT_TOKEN
const web = new WebClient(token)
const conversationId = 'general'

const attachments = [
  {
    fallback: 'アンケートです',
    callback_id: "oyatu",
    actions: [
      {
        name: "oyatu_list",
        // セレクトボックスの初期テキスト
        text: "セレクト?",
        // typeをselectに
        type: "select",
        // optionsを追加
        options: [
          {
            text: '書籍',
            value: 'apple'
          },
        ]
      }
    ]
  }
]

const option = {
  attachments: attachments,
  channel: conversationId,
  icon_emoji: ':question:',
  username: 'Book-put'
}

web.chat.postMessage(option)
  .then(res => {
    console.log('書籍を投稿しました。 ', res.ts)
  })
  .catch(console.error)
require('dotenv').config();

const express = require("express")
const app = express()
const bodyParser = require('body-parser')
const urlencodedParser = bodyParser.urlencoded({ extended: false })

// Web API関連
const { WebClient } = require('@slack/client')
const token = process.env.NDE_TOKEN
const web = new WebClient(token)

app.post('/', urlencodedParser, function (req, res) {
  const payload = JSON.parse(req.body.payload)
  console.log(payload)

  switch (payload.type) {
    // interactive_messageを受け取った時の処理
    case 'interactive_message':
      // dialog.openメソッドでダイアログを展開
      web.dialog.open({
        dialog: {
          // ダイアログの設定
          callback_id: "dialog",
          title: "書籍投稿",
          submit_label: "送信します",
          notify_on_cancel: true,
          // フォームの設定
          elements: [
            {
              type: "text",
              label: "名前",
              name: "name",
              hint: "お名前を入力してください",
              placeholder: '題材名'
            },
            {
              type: "text",
              subtype: "email",
              label: "メールアドレス",
              name: "email",
              placeholder: "example@email.com",
            },
            {
              type: "text",
              subtype: "tel",
              label: "電話番号",
              name: "tel",
              placeholder: "123-4567",
            },
            {
              label: "評価",
              type: "select",
              name: "review",
              optional: "true",
              options: [
                {
                  label: "すごく良い",
                  value: "very_good"
                },
                {
                  label: "良い",
                  value: "good"
                },
                {
                  label: "普通",
                  value: "normal"
                },
                {
                  label: "悪い",
                  value: "bad"
                },
                {
                  label: "すごく悪い",
                  value: "very_bad"
                }
              ]
            },
            {
              type: "textarea",
              label: "その他",
              name: "others",
              hint: "好きに書いてください",
              optional: "true"
            }
          ]
        },
        // payloadにあるtrigger_idをトリガーIDに指定
        trigger_id: payload.trigger_id
      })
        .then(() => {
          console.log('ダイアログを送信しました')
        })
        .catch(console.error)
      res.status(200).end()

      break
    // dialog_submissionを受け取った時の処理
    case 'dialog_submission':
      console.log('ダイアログの結果を受信しました')

      // メールアドレス判定用の正規表現
      const re = {
        email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
      }
      // メールアドレスの形式が正しくなかったらエラー
      if (re.email.test(payload.submission.email) === false) {
        // json形式で送信するとSlackに反映される
        res.setHeader('Content-Type', 'application/json')

        res.send({
          "errors": [
            {
              "name": "email",
              "error": "メールアドレスの形式が正しくありません"
            }
          ]
        })
      }
  }
})

app.listen(3000)


![Dialog

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

送信後に正常なレスポンスをSlack側に返さないと、Dialogが閉じられないです!

dialog_submission

の処理の中でも一度status200を返してみても同じでしょうか。

SlackのDocumentを確認してみたところ、

Upon receiving this payload, your server must respond within 3 seconds, 

とありましたが、Submissionのレスポンスは3秒以内に返してますでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/18 08:42

    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る