Node.js * LineBot(Messaging API)でwebhookがうまくいかない

パーサ使っているのが原因かも

Line Botの作り方は以下が詳しい(手順は多少変わっている)
https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d




ほぼほぼ調べるだけでいけるのだが以下のコードが動かなかった。


import * as line from "@line/bot-sdk"

  router.post("/line",
    line.middleware(LINE_CONFIG), (req, res) => {
      const client = new line.Client(LINE_CONFIG)

      function handleEvent(event: any) {
        if (event.type !== "message" || event.message.type !== "text") {
          return Promise.resolve(null)
        }

        return client.replyMessage(event.replyToken, {
          type: "text",
          text: event.message.text,
        })
      }

      Promise
        .all(req.body.events.map(handleEvent))
        .then((result) => {
          res.json(result)
        }).catch((err) => {
          console.log(err)
          res.send(err)
        })
    })

line developers のコンソールから疎通チェックができるがエラー時の原因がわかりにくい
https://developers.line.me/console/

本家マニュアルを見ればわかる。
https://line.github.io/line-bot-sdk-nodejs/pages/guide/webhook.html
Do not use another body-parser before the webhook の項。
他のボディパーサ使うなよ的なことが書いてある。

app.use("/webhook", require("./routes/webhook"))
app.use(bodyParser.json())

app.use("/", require("./routes/index"))
// ... それ以外のルート

という風にやればいけそう。



それ以外にミドルウェアを使用しない方法もある。

import * as line from "@line/bot-sdk"

  router.post("/line", (req, res, { }) => {
    const client = new line.Client(LINE_CONFIG)

    function handleEvent(event: any) {
      if (event.type !== "message" || event.message.type !== "text") {
        return Promise.resolve(null)
      }

      return client.replyMessage(event.replyToken, {
        type: "text",
        text: event.message.text,
      })
    }

    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => {
        res.json(result)
      }).catch((err) => {
        console.log(err)
        res.send(err)
      })
  })

簡単なリプライならこれで十分だがちょっと凝ったことをしようとすると問題が出てくるかもしれない。


その他参考
https://github.com/line/line-bot-sdk-nodejs

2018年5月28日月曜日