繁体   English   中英

是否可以在快速路由中实现 socket.io 连接?

[英]Is it possible to implement socket.io connection in express route?

我实现了一个支付服务,它依赖于我的一个快速路由作为回调路由,所以每当用户想要支付时,他们将被重定向到这个与我的后端/前端域完全不同的支付服务链接。 付款成功后,用户将被重定向到我的快速GET路由(回调路由),在这条路由中,我将他们的资产提供给用户,然后将他们重定向到前端。

EXPECTATION我的期望是,每当用户进行购买时,我希望在前端进行实时更新,以便其他人在不刷新浏览器的情况下查看有关购买的一些详细信息。

WHAT I'VE TRIED我曾认为 socket.io 会解决这个问题,比如在路由中添加一个套接字连接,然后将数据推送到前端。 但是在进行了大量研究之后,似乎没有任何解决方案适合我。

HERE IS A SIMPLE CODE OF WHAT I'VE TRIED

===============================server.js ================ ========

const express = require("express")
const app = express()
const http = require("http")
const cors = require("cors")
const session = require("express-session")
const runSocket = require("./runSocket")
const { Server } = require("socket.io")

app.use(cors())
app.use(express.json())

const server = http.createServer(app)

server.listen(3004, () => {
  console.log("SERVER IS RUNNING")
})
const io = new Server(server, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"],
  },
})


const postRoute = require("./routes/postData")(io)

app.use("/post-data", postRoute)

====================================post数据路由============ ==========================

module.exports = function (io) {
  router.post("/", async (req, res) => { 
    const data = req?.body?.data.message
    const room = req?.body?.data?.room

    io.on("connection", (socket) => {
      console.log("Socket Running...")
      socket.to(room).emit("the_message", data)
    })

    console.log("Under socket...")
    return res.status(200).json({ data: req.body.data })
  })

  return router
}

此日志:在 postData 路由中未打印console.log("Socket Running...")

EXPECTATION我的期望是,每当用户进行购买时,我想在前端进行实时更新,以便其他人看到有关购买的一些细节。

更新:支付网关配置看起来像这样:

 const { body } = await got.post("https://payment-provider-link", {
    headers: { Authorization: "Bearer token for payment" },
    json: {
      email: "email@gmail.com",
      amount: amount * 100,
      initiate_type: "inline",
      callback_url: `${BackendBaseUrl}/payment-callback`, // <<<============
    },
  })

好的,所以您不需要 io.on("connection") 在您的路线中。 删除那段代码,只需将其更改为 io.to(room).emit("the_message", data)。 还要确保让其他 sockets 加入你试图发送的房间,否则他们将不会收到数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM