【发布时间】:2020-04-15 14:52:24
【问题描述】:
我正在尝试使用 socket.io 将数据从我的 express 服务器发送到 react-native 客户端以实现一些实时功能。但是在阅读了多篇文章/stackoverflow 帖子后,我一直面临着一些我无法解决的问题。
我正在使用 ngrok 通过 expo 将我的 react-native 应用程序与服务器连接。应用程序中的其他功能正常工作,但客户端和服务器端套接字之间的连接未正确建立。
当我使用 IP 地址作为 URL ("http://192.ip.address.:8000") 来连接服务器和客户端上的套接字时,我可以看到 socket.connected 在我正在导入的所有 react-native 屏幕中都是正确的套接字客户端。但是没有收到消息。
另外,有没有更好的方法在服务器/客户端的多个文件之间共享同一个套接字实例/连接?
服务器端代码
在 index.js 中设置 socket.io
const app = express();
const expressRouter = require("./routes");
const socketio = require("socket.io");
app.set("view engine", "ejs");
app.set("views", "./views");
app.use(express.urlencoded());
app.use("/", expressRouter);
const server = app.listen(port, function (err) {
if (err) {
console.log(`Failed to run the server: ${err}`);
return;
}
console.log(`Server running successfully on port: ${port}`);
});
const io = socketio(server);
app.set("io", io);
通过其中一个控制器 (/controllers/homeController.js) 句柄发送消息 --> /home
module.exports.getHome = function (request, response) {
let io = request.app.get("io");
io.on("connection", function (socket) {
console.log("connected io");
io.sockets.emit("some-channel", "some other new message text");
});
return response.render("dashboard");
};
React-Native 代码
设置套接字客户端以在所有屏幕中使用 (src/utils/socket.js)
import Constants from "./Constants";
import io from "socket.io-client";
export const socket = io(Constants.getNgrokUrl());
在其他屏幕(src/screens/homeScreen.js)中使用 socket.io 客户端
import { socket } from "../utils/socket";
const HomeScreen = ({ navigation }) => {
const [socketData, setSocketData] = useState("");
console.log("socket connection", socket.connected, "on home screen");
socket.on("some-channel", function (data) {
console.log("new data received", data);
setSocketData(data);
});
return (
<View>
<Text>{socketData}</Text>
</View>
);
};
【问题讨论】:
标签: node.js react-native express socket.io