socket.io 连接返回一个空数组。在不重新加载页面的情况下在 React 中接收数据的方法?

Umb*_*bro 2 javascript google-chrome-extension node.js socket.io reactjs

我在 React 中创建了一个 chrome 扩展。我正在尝试通过 socket.io 下载数据。我没有收到任何错误,但数组为空。

我应该设置标头和令牌,但我不知道在app.js服务器中的哪里设置。我在哪里可以设置:

const token = '12345'

headers: {
  'Authorization': `Bearer $ {token}`
}
Run Code Online (Sandbox Code Playgroud)

如果我创建,如何在客户端中设置port服务器app.js和端点?app.jsxchrome extension

有没有其他方法(socket.io 除外)componentDidMount()在React不重新加载页面的情况下在方法中接收数据?

当我转到该地址时http://127.0.0.1:4001,console.log 会显示给我New client connected并且Error: undefined

服务器

//app.js

const express = require("express");
const http = require("http");
const socketIo = require("socket.io");
const axios = require("axios");
const port = process.env.PORT || 4001;/How port in `chrome extension?`
const index = require("./routes/index");
const app = express();
app.use(index);
const server = http.createServer(app);
const io = socketIo(server); // < Interesting!
const token = "12345"; 


let interval;
io.on("connection", socket => {
  console.log("New client connected");
  if (interval) {
    clearInterval(interval);
  }
  interval = setInterval(() => getApiAndEmit(socket), 10000);
  socket.on("disconnect", () => {
    console.log("Client disconnected");
  });
});

const getApiAndEmit = async socket => {
    try {
      const res = await axios.get(
        "https://b.application.com/api/v1/scores?expand=createdBy"
      ); // Getting the data from DarkSky
      socket.emit("FromAPI", res.data); // Emitting a new message. It will be consumed by the client
    } catch (error) {
      console.error(`Error: ${error.code}`);
    }
  };

server.listen(port, () => console.log(`Listening on port ${port}`));
Run Code Online (Sandbox Code Playgroud)

//index.js

const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
  res.send({ response: "I am alive" }).status(200);
});
module.exports = router;
Run Code Online (Sandbox Code Playgroud)

客户

//app.jsx

import socketIOClient from "socket.io-client";

class App extends Component {
  constructor (props) {
    super(props);
    this.state = {
      scores: []
      endpoint: "http://127.0.0.1:4001" /How endpoint in `chrome extension`?
    }
  }

componentDidMount() {
  const { endpoint } = this.state;
  const token = "12345"; 

  const socket = socketIOClient(endpoint);

  socket.on("FromAPI", data => this.setState({ todos: data }));
}


  render () {
      <div>
      </div>
    )
  }
}

export default App;
Run Code Online (Sandbox Code Playgroud)

Umb*_*bro 5

我解决了:

const getApiAndEmit = async socket => {
    try {
      const res = await axios.get(
        "https://b.application.com/api/v1/scores?expand=createdBy",
         headers: {
           Authorization: `Bearer ${token}`
         }
      ); 
      socket.emit("FromAPI", res.data); // Emitting a new message. It will be consumed by the client
    } catch (error) {
      console.error(`Error: ${error.code}`);
    }
  };
Run Code Online (Sandbox Code Playgroud)