javascript - 为什么 io 未定义?

标签 javascript node.js express socket.io dom-events

我有一个使用 socket.io 的 express 应用程序。我不清楚客户首先需要什么,所以如果有人能告诉我如何做到这一点,我将不胜感激。此外,我不确定我的客户端代码是否正确。这是我的客户端套接字代码:

var socket = io.connect('http://localhost:3000');
    var tView = new totalViewModel();
    socket.on('connect', function (data) {
    function loggedIn(e) {
        e.preventDefault();
        var logged = {
            username: document.getElementById('pEmail'),
            password: document.getElementById('pWord')
         };
         socket.emit('login', JSONout(logged));
    }
    socket.on('uploadList', function (data) {
         tView.setNum(JSONin(data).total);
         ko.applyBindings(tView);
    });

    function logPurchase(e) {
         e.preventDefault();
         var purchObj = {
            price: document.getElementById('pPrice').value,
            priceName: document.getElementById('pName').value,
            entryDate: new Date()
        }
        socket.emit('purchaseLog', JSONout(purchObj));
    }

    function logDeposit(e) {
        e.preventDefault();
        var depositObj = {
             price: document.getElementById('dPrice').value,
             entryDate: new Date()
        };
        socket.emit('depositLog', JSONout(purchObj));
    }

    function getLogout(e) {
        e.preventDefault();
        socket.emit('goLogout', {
             none: 'none'
        });
    }

    function getIndex(e) {
        e.preventDefault();
        socket.emit('goIndex', {
            none: 'none'
        });
    }

    function getMonthly(e) {
         e.preventDefault();
         socket.emit('goMonthly', {
             none: 'none'
         });
    }

    function getYearly(e) {
        e.preventDefault();
        socket.emit('goYearly', {
            none: 'none'
        });
    }
    socket.on('wentMonth', function (data) {
         tView.setNum(total in JSONin(data));
         ko.applyBindings(tView);
    });
    socket.on('wentYearly', function (data) {
         tView.setNum(total in JSONin(data));
         ko.applyBindings(tView);
    });

    function register(e) {
         e.preventDefault();
         var reg = {
             username: document.getElementById('pEmail').value,
             password: document.getElementById('pWord').value,
             dateJoined: new Date(),
             total: 0,
             purchase: {},
             deposit: {},
             monthlyTotal: 0,
             yearlyTotal: 0
         };
         socket.emit('registered', JSONout(reg));
     }
});

这是我的服务器端代码:

var express = require('express');

var app = express();

var mongojs = require('mongojs');

var http = require('http');

var db = mongojs('127.0.0.1:27017/mySpendingDB', ['users']);

var server = http.createServer(app);

var io = require('socket.io').listen(server);

var path = require('path');

app.configure( function () {
   app.set('views', __dirname + '/views');
   app.set('view engine', 'ejs');
   app.engine('html', require('ejs').renderFile);
   app.use(express.static(path.join(__dirname, 'public')));
});

app.get('/', function (req, res) {
   res.render('login.html', {title: 'Login'});
});
app.get('/index', function (req, res) {
   res.render('index.html', {title: 'Daily'});
});
app.get('/monthly', function (req, res) {
   res.render('monthly.html', {title: 'Monthly'});
});
app.get('/yearly', function (req, res) {
   res.render('yearly.html', {title: 'Login'});
});
app.get('/register', function (req, res) {
   res.render('register.html', {tittle: 'Register'});
});
app.get('/logout', function (req, res) {
   req.logout();
   res.redirect('/');
});

var user="";

io.sockets.on('connection', function(socket) {
    console.log('socket.io started');
    socket.on('login', function(data) {
        console.log('login');
        var checkUser= db.users.find(data);
        console.log(checkUser);
        if(checkUser !== null) {
            console.log('checked user');
            user=checkUser.username;
            app.get('/index', function(req, res) {
                res.direct('/index');
            });
            socket.emit('uploadList', checkUser.total);
        }
    });
    socket.on('purchaseLog', function(data) {
        var usercollection = db.users.find({username: user});
        usercollection.purchase.save(data);
    });
    socket.on('depositLog', function(data) {
        var usercollection = db.users.find({username: user});
        usercollection.deposit.save(data);
    });
    socket.on('goLogout', function(data){
        app.get('/logout', function (req, res) {
            req.logout();
            res.redirect('/');
        });
    });
    socket.on('goIndex', function(data){
        app.get('/index', function (req, res) {
            res.redirect('/index');
        });
    });
    socket.on('goMonthly', function(data){
        app.get('/monthly', function (req, res) {
            res.redirect('/monthly');
        });
        var monTot = db.users.find({username: user}).monthlyTotal;
        socket.emit('wentMonthly', monTot);
    });
    socket.on('goYearly', function(data){
        app.get('/index', function (req, res) {
            res.redirect('/index');
        });
        var yearTot = db.users.find({username: user}).yearlyTotal;
        socket.emit('wentYearly', yearTot);
    });
    socket.on('registered', function(data){
        db.users.save(data);
        app.get('/index', function (req, res) {
            res.redirect('/index');
        });
    });
});

server.listen(3000);

最佳答案

在客户端你可能忘记添加 socket.io 库:

<script src="http://localhost:3000/socket.io/socket.io.js"></script>

在服务器上它应该可以正常工作(你正确定义了 io)。

关于javascript - 为什么 io 未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18433316/

相关文章:

javascript - 使用 Javascript,每 30 秒刷新一次页面,除非出现短语

javascript - 限制 div 中的文本,但使整个 div 可点击

javascript - 我如何从 inappbrowser cordova 请求桌面站点

android - 如何降低 Google Map Api 成本或优化跟踪和 api 命中的方法

javascript - 如何让 Node.js 监听表中新的 sqlsrv 行

Mongodb Atlas Express.js 错误 : getaddrinfo ENOTFOUND

node.js - 使用node.js和Jade但index.jade没有显示

javascript - jQuery each 和 change 合并

javascript - 使用 Observable.from(<Promise>) 并在 Observable 中捕获错误时如何处理 `UnhandledPromiseRejectionWarning`

javascript - 使用 Node.js 和 Express 发布时如何访问请求正文?