【问题标题】:Node.js Websocket Socket.io Steam MongoDB not saving dataNode.js Websocket Socket.io Steam MongoDB不保存数据
【发布时间】:2015-07-22 21:06:48
【问题描述】:

我在 GoDaddy 有网站托管。 我在 DigitalOcean 有 VPS。

我要去我的网站(在 GoDaddy 托管)并有一个输入字段(我们将其命名为贸易链接字段,因为它应该包含 URL)。

用户将 URL 放入“trade-link”字段 > 按“保存”按钮 > 数据正在通过 Websocket 发送到 VPS(在 DigitalOcean)> 数据正在保存在 MongoDB 中。

最后一步不起作用。 我有一个小代码记录控制台上的内容:

{"type":1,"steamid":"76561198092387621","link":"steamcommunity.com/tradeoffer/new/?partner=THISISURL";} 

所以服务器正在接收数据,这很好。现在有问题。此数据需要保存到 MongoDB。


让我们开始在我的网站 (GoDaddy) 上输入字段:

<input type="text" rel="get-trade-link" id="par2" name="par2" placeholder="https://steamcommunity.com/tradeoffer/new/?partner=URL">
                        <div class="btn-yellow save-link">

然后是 script.js 文件(Godaddy):

var socket = io.connect('http://url:8303');
ws = new WebSocket('ws://url:8305');

    function sendTradeLink(tradelink){
        ws.send(JSON.stringify({
            type: 1,
            steamid: getSteamID(),
            link: tradelink
        }));
    }

$(document).on('click', '.save-link', function() {
        var link = $('input[rel="get-trade-link"]').val();
        if (link.indexOf('https://steamcommunity.com/tradeoffer/new/?partner=') < 0) {
        } else {
            sendTradeLink(link);
                }
        }   
    });

VPS:

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


// all another
var MongoClient = require('mongodb').MongoClient;

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({ port: 8305 });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  ws.send('something');
});

socket.on('1', function(data){
    updateTradeLink(data.steamid, data.link);
});

'1' - 我认为它的意思是'类型'。不是我的剧本,是我买的,但是很难跟他交流。

    socket.on('link', function(data){
        userListDB.find({'steamid':data.steamId, 'type' : 'link'}).toArray(function(err, list) { 
            socket.emit('link', { list : list });
        });
    });   

 function updateTradeLink(sid, link) {
        if(!g_Mongoconnected)
            return 0;

        existUser(sid, function(exist){
            if(exist) {
                userListDB.update({steamid: sid}, {steamid: sid, tradelink: link, type : 'link'});
            } else {
                userListDB.insert({steamid: sid, tradelink: link, type : 'link'}, {w:1}, function(err) {
                    if(err) {
                        helper.log('Error inserting tradelink', 485, err);
                    }
                });
            }
        });
    }

P.S 我买了那个脚本并自己添加了那部分代码:

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({ port: 8305 });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  ws.send('something');
});

编辑:

MongoClient.connect('mongodb://localhost:27017', function (err, db) {
    if (err) {
        helper.log('Mongodb connection error', 425, err); 
        return 0;
    }

    userListDB = db.collection('users');
    gameDB = db.collection('gamedb');
    g_Mongoconnected = true;
    helper.msg('mongo connected');

    gameDB.find({name: 'counter'}).toArray(function (error, list) {
        if(list.length == 0) {
            currentGame=0; 
            gameDB.insert({name: 'counter', counter: 0}, {w:1}, function(err) {if(err) console.log('Error <1>');});
        } else {
            currentGame = list[0].counter;
        }
    });
});

【问题讨论】:

  • 与其对代码进行快照,不如将代码直接粘贴到您的问题中。使用顶部的 { } 图标添加降价编码。让人们更容易为您提供帮助。
  • 我当然迷路了。你到底想完成什么?什么不按您期望的方式工作?什么是交易 URL(我会用一个 Yahoo 换两个 Google?)你为什么首先使用套接字?套接字是最好的方法吗?服务器托管在哪里?他们是否支持带有套接字的 Node.js? (等等...)
  • 它是一个与 CS:GO 相关的网站。您需要设置您的交易网址:如 steamcommunity.com/tradeoffer/new/?partner=something 等。 1. 您访问网站并设置您的交易网址。 2. 我通过 Websocket 连接到服务器获取该 url。 3.它需要保存到MongoDB,但它没有。如您所见,我正在获取这些 URL,但它没有保存到 MongoDB
  • “有人在我的网站上放了一个链接”吧?这是您托管的服务器,还是您创建的网站,托管在 steamcommunity 上?如果它是您的主机,为什么还要使用套接字?从您的站点提交的数据中获取数据并将其粘贴到 Mongo 中。如果在 Steam 社区,你怎么知道他们甚至允许套接字连接?大多数服务器没有。
  • 我在 Godaddy 主机上托管网站,这是允许的。我买了脚本,需要配置它,卖给我的人说不同的语言,很难理解他在说什么。

标签: node.js mongodb websocket socket.io steam


【解决方案1】:

试试这个修改:

wss.on('connection', function connection(ws) {
    ws.on('message', function incoming(message) {
        console.log('received: %s', message);
        if(message.type == 1){
            updateTradeLink(message.steamid, message.link);
        };
        if(message.type =='link'){
            userListDB.find({'steamid':message.steamId, 'type' : 'link'}).toArray(function(err, list) { 
                ws.emit('link', { list : list });
            }
        };
    });
});   

然后是 Mongo DB 的东西:

function updateTradeLink(sid, link) {
    if(!g_Mongoconnected){
        console.log('Oops. Mongo DB not connected..');
        return 0;
    }

    existUser(sid, function(exist){
        if(exist) {
            userListDB.update({steamid: sid}, {steamid: sid, tradelink: link, type : 'link'});
        } else {
            userListDB.insert({steamid: sid, tradelink: link, type : 'link'}, {w:1}, function(err) {
                if(err) {
                    helper.log('Error inserting tradelink', 485, err);
                }
            });
        }
    });
}

【讨论】:

  • 我试过这个: wss.on('connection', function connection(ws) { ws.on('1', function(data){ updateTradeLink(data.steamid, data.link); }); });
  • 现在至少我得到错误:userListDB.find({'steamid':data.steamId, 'type' : 'link'}).toArray(function( ^ ReferenceError: data is not defined
  • 这意味着我们已经完成了套接字通信。现在的问题是 MongoDB 的东西。让我说,我对您的更新、代码清理和更好的沟通印象深刻。不幸的是,我想查看所有 MongoDB 设置代码...尤其是 userListDB 定义在哪里?存在用户定义在哪里?还有 g_Mongoconnected
  • var userListDB, gcDB, gameDB;
  • 函数existUser(用户,回调){ if(!g_Mongoconnected) return 0; userListDB.find({steamid: user}).toArray(function (error, list) { callback (list.length !== 0); }); }
猜你喜欢
  • 2017-01-27
  • 2016-03-31
  • 2023-03-18
  • 1970-01-01
  • 2019-07-20
  • 2020-03-25
  • 2013-05-29
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多