как сделать событие подключения к websocket внутри экспресс-запроса get? - PullRequest
1 голос
/ 26 февраля 2020

я пытаюсь получить websocket в экспресс-запросе router.get

здесь код app.js

const { createServer } = require("http");
const mongoose = require('mongoose');
const config = require('./config');
const WebSocket = require('ws');
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
const server = createServer(app);
app.use("/RegisterApi", require("./Routes/RegisterApi/RegisterApi"));
const wss = new WebSocket.Server({ server });
app.wss = wss;
app.locals.clients = [];


server.listen(config.PORT, function () {
    console.log(`im listening at ${config.PORT}`);
    mongoose.connect(config.MONGODB_URI, {
        useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true,
        useFindAndModify: false
    })

RegisterApi.js

const router = express.Router();
const nodemailer = require("nodemailer");
const Users = require("../../Models/YakutGamesUserModel");
const WebSocket = require('ws');

//const jwt = require("jsonwebtoken");



router.get('/login'/*,verifyToken*/, async (req, res) => {
    console.log(req.query.name);
    const currentUser = await Users.findOne({ name: req.query.name });
    const userunchecked = false;
    if (!currentUser) {
        res.send("invalid user ");
        userunchecked = true;
    }
    else if (!currentUser.confirmed) {
        res.send("confirm your email " + currentUser.name); userunchecked = true;

    }
    else if (currentUser.password !== req.query.password) { res.send("password is wrong"); userunchecked = true; }

    const wss = req.app.wss;
    const clients = req.app.locals.clients;
    await wss.once("connection", (ws, request) => {

        console.log("Total connected clients:", wss.clients.size);


        const ip = request.connection.remoteAddress;
        console.log(ip);
        if (userunchecked) { ws.delete; console.log('wtf'); return; }
        const userObject = { id: currentUser._id, object: ws };
        clients.push(userObject);
        ws.send("ID= " + currentUser._id);


    });
});

те на стороне сервера в качестве клиента я использую Unity

unity code C#

async void Login()
    {
        newUser.name = namefield.text;
        newUser.password = passfield.text;
        string url = String.Format("http://localhost:7989/RegisterApi/login?name={0}&password={1}", newUser.name, newUser.password);
        StartCoroutine(LoginUser(url, () => { Debug.Log("login req done"); }));
        websocket = new WebSocket("ws://localhost:7989/RegisterApi/login");

        websocket.OnOpen += () =>
        {
            Debug.Log("Connection open!");
        };

        websocket.OnError += (e) =>
        {
            Debug.Log("Error! " + e);
        };

        websocket.OnClose += (e) =>
        {
            Debug.Log("Connection closed!");
        };

        websocket.OnMessage += (bytes) =>
        {
            var message = System.Text.Encoding.UTF8.GetString(bytes);
            Debug.Log("OnMessage! " + message);
        };

        await websocket.Connect();

    }

проблема в том, что сервер не получает console.log ("Всего подключенных клиентов:", wss.clients.size) ; в первый раз, когда я запускаю функцию входа из единства. но если я запускаю сервер входа в систему второй раз, получим это, но на этот раз wss.clients.size будет равен 2.

что я делаю не так?

1 Ответ

1 голос
/ 30 апреля 2020

Я думаю, что вы пытаетесь войти в систему, запрос http вы можете сделать один раз.

Этот код работал для меня.

IEnumerator LoginUser(string url, Action onSuccess)
{
    UnityWebRequest req = UnityWebRequest.Get(url);

        yield return req.SendWebRequest();
        while (!req.isDone)
            yield return null;

        string result = req.downloadHandler.text;
        string[] resultArray = result.Split(' ');
        if (resultArray[0] == "yourCode")
        {
        myTempID = resultArray[1];
        Debug.Log(myTempID);

        Wss(myTempID);
        LoginLog.GetComponent<TextMeshProUGUI>().text = "login done";
        mainMenuButtonHandlersGO.GetComponent<MainMenuButtonHandlers>().OpenFirstCanvasButtons();
        messageHandlerGO.GetComponent<WssMessageHandler>().MessageHandlerFunction();

    }
    else LoginLog.GetComponent<TextMeshProUGUI>().text = result;
        onSuccess();

}

async void Wss(string code)
{
    websocket = new WebSocket(String.Format("ws://{1}:7989/RegisterApi/login?parentID={0}", code, mainAddress));
    websocket.OnOpen += () =>
    {
        Debug.Log("Connection open!");
    };

    websocket.OnError += (e) =>
    {
        Debug.Log("Error! " + e);
    };

    websocket.OnClose += (e) =>
    {

        Debug.Log("Connection closed!");
    };

    // Keep sending messages at every 0.3s
    //InvokeRepeating("SendWebSocketMessage", 0.0f, 5.0f);

    // waiting for messages

    await websocket.Connect();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...