LoginSignup
0
0

Next.js でPusher を trigger するときは await が必要

Posted at

概要

タイトルの通りですが、
Next.js でpusher を使ってpub sub するとき、
api/xxx.ts

上で

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
    if (req.method === 'POST') {

        const Pusher = require("pusher")

        const pusher = new Pusher({
            appId: process.env.NEXT_PUBLIC_PUSHER_APP_ID,
            key: process.env.NEXT_PUBLIC_PUSHER_KEY,
            secret: process.env.NEXT_PUBLIC_PUSHER_SECRET,
            cluster: process.env.NEXT_PUBLIC_PUSHER_CLUSTER,
            useTLS: false
        });

        pusher.trigger(
            process.env.NEXT_PUBLIC_PUSHER_CHANNEL_NAME,
            process.env.NEXT_PUBLIC_PUSHER_EVENT_NAME,
            {
                message: "hello world"
            })

        console.log(`id: ${log_id}`)
        res.status(200).json({ message: 'POST request handled' });
    } else {
        res.status(405).end(); // Method not allowed
    }
}

とやっていたところ、
Vercel上で

Unhandled Promise Rejection 	{"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"PusherRequestError: Request failed with an error","reason":{"errorType":"PusherRequestError","errorMessage":"Request failed with an error","name":"PusherRequestError","stack":["Error","    at new RequestError (/var/task/node_modules/.pnpm/pusher@5.1.3/node_modules/pusher/lib/errors.j

...

というようなエラーが出てきちんとtriggerできていませんでした。

このとき、Pusher のダッシュボードからtrigger を手動実行すると
Next.jsのクライアント側ではきちんとsubできていたので、trigger が問題だったとわかりました。

このとき、
https://github.com/vercel/next.js/discussions/48433#discussioncomment-5710270
こちらを参照し、

pusher.trigger には awaitが必要だったとわかりました。

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
    if (req.method === 'POST') {

        const Pusher = require("pusher")

        const pusher = new Pusher({
            appId: process.env.NEXT_PUBLIC_PUSHER_APP_ID,
            key: process.env.NEXT_PUBLIC_PUSHER_KEY,
            secret: process.env.NEXT_PUBLIC_PUSHER_SECRET,
            cluster: process.env.NEXT_PUBLIC_PUSHER_CLUSTER,
            useTLS: false
        });

        await pusher.trigger(
            process.env.NEXT_PUBLIC_PUSHER_CHANNEL_NAME,
            process.env.NEXT_PUBLIC_PUSHER_EVENT_NAME,
            {
                message: "hello world"
            })

        console.log(`id: ${log_id}`)
        res.status(200).json({ message: 'POST request handled' });
    } else {
        res.status(405).end(); // Method not allowed
    }
}

同じような現象で時間を溶かした方がいたら参考になると幸いです。

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0