首页 > 解决方案 > Socket.io,Mongodb 将未定义返回到前端

问题描述

我想将 socekt.io 用于我正在构建的新项目。我正在使用 socket.io 作为登录组件,并且将来会使用 socket.io 来更新诸如聊天应用程序之类的页面。我也在使用 mongoose 来处理我的 mongodb 连接。我正在输入用户名,并将密码返回到我的前端以进行 bcryptjscompareSync哈希处理。我遇到的问题是返回到前端的任何内容都是未定义的。当我打印出返回到前端的内容时,它会打印出我正在寻找的值。后端发出一些东西,前端接收一些东西之间发生了一些事情,但我不知道它到底是什么。这是我的后端代码:

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)
        }

谢谢您的帮助!

标签: mongodbmongoosesocket.io

解决方案


当您执行 socket.on 时,它应该包括您希望通过 socket.io 输出更改的整个语句。见下文:

异步函数 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')

        }

}


推荐阅读