Socket.io, Mongodb возвращает undefined во фронтенд - PullRequest
0 голосов
/ 18 июня 2020

Я хочу использовать socekt.io для нового проекта, который я создаю. Я использую socket.io в качестве компонента входа в систему и буду использовать socket.io в будущем для обновления страниц, таких как приложение чата. Я также использую mon goose для обработки моего соединения mongodb. Я беру имя пользователя и возвращаю пароль на свой интерфейс для хеширования bcrypt js compareSync. Проблема, с которой я сталкиваюсь, заключается в том, что все, что возвращается в интерфейс, не определено. Когда я распечатываю то, что возвращается в интерфейс, он распечатывает значение, которое я ищу. Что-то происходит между сервером, который что-то испускает, и интерфейсом, который что-то получает, но я не знаю, что именно. Вот мой код для серверной части:

const express = require('express')
const socket = require('socket.io');
const http = require('http');
const router = require('./router');
const mongoose = require('mongoose');
let Player = require('../models/player.model');



require('dotenv').config();

const PORT = process.env.PORT || 5000;

const app = express();
const server = http.createServer(app);

const uri = process.env.ATLAS_URI;
mongoose.connect(uri, {useNewUrlParser: true, useCreateIndex: true,
useUnifiedTopology: true });

const connection = mongoose.connection;

connection.once('open',() => {
    console.log('MongoDB database connection established successfully')
});

const io = socket(server);

io.on('connection', (socket) => {
    console.log('We have a new connection');

    socket.on('login', ({ username }, callback) => {
        console.log(username);

        Player.find({"username": username}, function (err, player) {
            if(err) {
                console.log("there has been an error"), {player: null}
            }
            socket.emit('id', { password: player[0]['password'].toString(), id : player[0]['_id']})
        })   })})

app.use(router);

server.listen(PORT, () => console.log('Server is working'))

Вот мой код для передней части:

    const ENDPOINT = 'localhost:5000';
    async function submitAccount (e) {

        e.preventDefault();

        socket.emit('login', { username });

        socket.on("id", (response) => {
            setPassword2(String(response['password']));
            id = response['id']; console.log(id);
            console.log(password2)
        }); 
        try {
            if (bcrypt.compareSync(password, password2) == true) {

                props.setCookie("id", id);
                setAccess(true);
                access2 = true;
                console.log(access2)
                console.log('works')

            }
            else {

                setErrorType('Invalid Password')
                setErrorMsg('There is an issue with your password. Please try again')
                setOpenModal(true)
                console.log(password);
                console.log(password2);
            }
        }
        catch {
            setErrorType('Invalid Username')
            setErrorMsg('This username does not exist. Please try another')
            setOpenModal(true)
        }

Спасибо за помощь!

1 Ответ

0 голосов
/ 18 июня 2020

Когда вы выполняете socket.on, он должен включать весь оператор, который вы хотите изменить с помощью вывода socket.io. См. Ниже:

asyn c function submitAccount (e) {

    e.preventDefault();

    socket.emit('login', { username });

    socket.on("id", (response) => {
        setPassword2(String(response['password']));
        id = response['id']; console.log(id);
        console.log(password2)

    if (password2 != undefined) {
    try {
        if (bcrypt.compareSync(password, password2) == true) {

            props.setCookie("id", id);
            setAccess(true);
            access2 = true;
            console.log(access2)
            console.log('works')

        }

}

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