socket.io 怎么能像 axios 一样使用?

Posted

技术标签:

【中文标题】socket.io 怎么能像 axios 一样使用?【英文标题】:How socket.io can be used like axios? 【发布时间】:2021-12-23 04:51:30 【问题描述】:

我有一个应用程序,它内置在 axios 中,只考虑 PUT、POST、DELETE、GET。看起来像这样

getAPI = axios.create(.....)
....
getAPI.post('signup/', email, password)
          .then(res => 
          /// return some res
          )
          .catch(err => 
          /// some error is show if not succeed

          )
  

还可以使用不同的方法执行“post/”、“logout/”、“signup/”。 后来我发现,为了在客户端实时发布动作,我们需要使用 websocket。所以我使用了 socket.io 。 我已经设置了服务器和客户端。

在这样的服务器套接字连接中

io.on('connection', socket => 
    console.log('User is connected on socket');
    socket.on('disconnect', () => console.log('disconnected'));
)

在客户端连接中,我搜索了教程并使用了 contextAPI,并传递给了所有组件。 在我的特定组件中,我已经发布了用户帖子,并且显示了用户帖子我已经放置了这样的代码

  const socket = useContext(AuthContext);
  useEffect(() => 
    socket.on("connect", () => 
    console.log("client connected")
  )
    return ()=> socket.disconnect()
  )

现在我如何使用带有捕获错误但带有 socket.io 的 axios 请求。使用与 axios 集成的 socket.io 对我来说似乎很难。虽然我不需要在身份验证时使用套接字。但我需要在“/post”请求中使用它。

通过 axios.POST.then().catch(), axios.GET ...... 但我很困惑将 axios 的东西集成到客户端的套接字中。

在后端,我也有这样的路线

router.get('/logout', logout)
router.post('/post/create', post)

每个处理程序都像这样

exports.postCreate = (req, res) => 
  let post =   new Post(req.body)
  post.save((err, post) => 
    if(err)
      return res.status(400).json(error: "Error")
    
  return res.json(post)
  )

但是如果我想使用socket.io,我应该怎么做?我对 socket.io 文档感到非常困惑,没有显示用于处理事情。

如果你对这些事情有想法, 请回答我谢谢你的回答

【问题讨论】:

【参考方案1】:

Socket.io 保持其连接处于活动状态。为了处理错误。您将需要收听事件。例如: Handling connection errors:

socket.on("connect_error", (error) => 
  // ...
);

Handling disconnect errors:

socket.on("disconnect", (reason) => 
  if (reason === "io server disconnect") 
    // the disconnection was initiated by the server, you need to reconnect manually
    socket.connect();
  
  // else the socket will automatically try to reconnect
);

如果您想确保您的服务器端处理您的请求并需要确认,您可以使用可选的“确认”功能,例如this:

// client side
socket.emit("ferret", "tobi", (data) => 
  console.log(data); // data will be "woot"
);

// server side:
  io.on("connection", (socket) => 
    socket.on("ferret", (name, fn) => 
      fn("woot");
    );
  );

【讨论】:

以上是关于socket.io 怎么能像 axios 一样使用?的主要内容,如果未能解决你的问题,请参考以下文章

linux怎么能像windows一样查看tomcat的控制台输出内容阿

开发苹果应用能像安卓那样把一个手机html5版嵌入应用外壳作成应用吗?

如何像前台服务一样启动 socket.io 以保持连接并监听消息

怎么使用 Socket.io 连接 WebSocket 服务

lin与win系统有何分别 linux能像win一样吗20分

Node.js 使用 socket.io 进行重构