“错误-未处理拒绝:错误:侦听EADDRINUSE:地址已经在使用中:::3000”当我使用Slack Bolt for JavaScript和ngrok和Next.js时

50few1ms  于 2022-12-23  发布在  Java
关注(0)|答案(1)|浏览(226)

背景

我们正在开发一个Slack Bot。这次我们使用了由Slack、React、Next.js和ngrok提供的Bolt for JavaScript(Node.js)。下面是它们各自的功能。

  • 用于JavaScript的螺栓:我不想使用Slack的基本API,但想从 Package 它的函数中获益。
  • React:需要使用Next.js
  • Next. js:Slack需要一个请求URL,以便在Slack中发生诸如提及之类的事件时通知我的bot应用,但Next.js可以轻松创建一个API端点来设置该URL(例如/api/something)
  • ngrok:在本地开发环境中,该URL将是http://localhost:3000,因此协议将是http而不是https。Slack不允许这样做,因此我们需要一个以https开头的URL,该URL将通过隧道连接到本地http://localhost:3000

待解决的问题。

我已经确认,如果我在Slack的某个工作区中键入@xxxx,事件将通知给https://xxxx.jp.ngrok.io/api/slack/events

app.event("app_mention", async ({ event, say }) => {
  .
  .
  .
}

未调用,并发生以下错误

error - unhandledRejection: Error: listen EADDRINUSE: address already in use :::3000

我想知道为什么和如何解决这个问题。

源码

/api/空闲时间/事件. ts

import type { NextApiRequest, NextApiResponse } from "next";
require("dotenv").config();
import app from "../../../config/slackAuth";

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  // Unique case for Slack challenge
  if (req.body.challenge) return res.status(200).json(req.body);

  // Subscribe to 'app_mention' event in your App config
  // See https://api.slack.com/tutorials/tracks/responding-to-app-mentions
  app.event("app_mention", async ({ event, say }) => {
    try {
      // Response to the message in the thread where the event was triggered with @${message.user} 
      // See https://slack.dev/bolt-js/concepts#message-sending
      await say({
        text: `Hi <@${event.user}>!`,
        thread_ts: event.ts,
      });
    } catch (error) {
      await say({
        text: `<@${event.user}> ${error.message}.`, // @userName Request failed with status code 429.
        thread_ts: event.ts,
      });
    }
  });

  (async () => {
    // Start this app
    await app.start(process.env.PORT || 3000);
    console.log("⚡️ Bolt app is running!");
  })();

  return res.status(404).json({ message: "Unknown event type" });
}

错误代码

error - unhandledRejection: Error: listen EADDRINUSE: address already in use :::3000
    at Server.setupListenHandle [as _listen2] (net.js:1331:16)
    at listenInCluster (net.js:1379:12)
    at Server.listen (net.js:1465:7)
    at C:\Users\81906\Documents\slackGpt3\node_modules\@slack\bolt\dist\receivers\HTTPReceiver.js:176:25    
    at new Promise (<anonymous>)
    at HTTPReceiver.start (C:\Users\81906\Documents\slackGpt3\node_modules\@slack\bolt\dist\receivers\HTTPReceiver.js:142:16)
    at App.start (C:\Users\81906\Documents\slackGpt3\node_modules\@slack\bolt\dist\App.js:241:30)
    at eval (webpack-internal:///(api)/./pages/api/slack/events.ts:69:69)
    at handler (webpack-internal:///(api)/./pages/api/slack/events.ts:71:7)
    at Object.apiResolver (C:\Users\81906\Documents\slackGpt3\node_modules\next\dist\server\api-utils\node.js:363:15) {
  code: 'EADDRINUSE',
  errno: -4091,
  syscall: 'listen',
  address: '::',
  port: 3000
}
8i9zcol2

8i9zcol21#

问题

在Next.js中使用Slack Bolt for JavaScript并不简单,原因如下:

  • 在Next.js项目中运行npm run dev将在localhost:3000启动一个服务器。
  • 在Slack Bolt for JavaScript中运行app.start()会启动一个使用Express.js的服务器,该服务器也会尝试使用localhost:3000。
  • 这会导致错误,因为两个服务器正在尝试使用同一个端口。

此信息是由Slack的某个人提供的,源代码可以在https://github.com/slackapi/bolt-js/issues/1687上找到。
溶液

  • 可以将Bolt使用的端口号更改为3001。
  • 但是,这将使localhost上的两个服务器:3000和3001难以相互通信。
  • 在Slack Bolt for JavaScript控制台中注册的请求URL设置为3000,因此在那里接收的事件将无法流向端口3001。

相关问题