You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js结合Rails ActionCable实现通知功能收不到消息如何解决

问题根因&修复方案

1. 核心问题:回调函数拼写错误

你代码中定义的接收消息回调名为recieved,但ActionCable官方规范的回调名是**received**(i和e的顺序错误,你多写了一个e),这是导致连接正常但收不到消息触发日志的直接原因。

2. 完整优化代码

当前Hook实现还存在重复创建连接、无资源清理逻辑等潜在问题,调整后的可用版本如下:

import { API_URL } from '@config/config'
import { useAuthentication } from '@hooks/useAuthentication'
import { useEffect, useRef } from 'react'

export const useNotification = () => {
  const id = useAuthentication()?.user.data?.id
  // 存储consumer实例避免重复创建
  const consumerRef = useRef(null)

  useEffect(() => {
    // 无有效用户ID时不创建无效连接
    if (!id) return

    const initTerminal = async () => {
      // 已经存在实例则跳过创建逻辑
      if (consumerRef.current) return

      const { createConsumer } = await import('@rails/actioncable')
      const consumer = createConsumer(`${API_URL}/cable`)
      consumer.subscriptions.create(
        {
          channel: 'NotificationChannel',
          user_id: id,
        },
        {
          connected() {
            console.log('Notification channel connected\nUser id:', id)
          },
          // 修正拼写错误的回调名
          received(data) {
            console.log('NEW NOTIFICATION: ', data)
          },
        }
      )
      consumerRef.current = consumer
    }

    initTerminal()

    // 组件卸载/用户ID变更时主动断开连接释放资源
    return () => {
      if (consumerRef.current) {
        consumerRef.current.disconnect()
        consumerRef.current = null
      }
    }
  // 仅用户ID变化时重新初始化连接
  }, [id])
}

3. 后端校验项(前端修改后仍异常可排查)

  • 检查Rails端NotificationChannel的流配置,确认stream_for/stream_from的标识和订阅参数匹配
  • 确认消息推送逻辑是对应用户ID的流推送,没有发错频道
  • 确认Rails跨域配置已放开WebSocket的请求来源限制

内容的提问来源于stack exchange,提问作者Book Teeranai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:27:03