Board logo

主題: [javascript] 請教 node.js 及 socket.io 存取 mysql 資料庫同步、非同步問題 [打印本頁]

發表人: daidai    時間: 2013-7-21 08:35 PM     主題: 請教 node.js 及 socket.io 存取 mysql 資料庫同步、非同步問題

請教有使用過 node.js 存取 mysql 的版友,同步及非同步問題

最近公司主管挖了個洞給我跳,要我做遊戲伺服器,在上位的主管認為不過就是個聊天室,但是沒想到底層協定的應用及遊戲客戶端同步接收訊息的問題,單機版的遊戲已經出貨出去,還跟客戶承諾後續會更新成連線版。小弟我的本職是網頁程式設計師,用PHP設計公司網頁及系統,找遍了 google 相關文章,實在想不出問題點在哪,所以特來請教大家一些觀念

我用 node.js 及 socket.io(支援多種協定及現成的 room 及廣播機制) 實做聊天室訊息推播架構,想把這個應用在遊戲伺服器的同步訊息收發,使用 websocket 協定,在做連線驗證機制時,碰到了難題,
以下的函式都沒回傳值,我大概知道是同步、非同步問題,也嘗試使用 https://github.com/caolan/async (async.js) 這個套件,不過始終實做不出來,麻煩大家了,感謝

function auth(username)
{
        // 引入 mysql connect
        var config = require("./mysql_db.js");
        var db_connection = config.db;

        db_connection.query("SELECT * FROM `zp_machine` LEFT JOIN `zp_customer` ON `zpm_zpc_id` = `zpc_id` WHERE `zpm_sn` =?",[username], function(err, rows, fields) {
            if(err){
                console.log(err);
                return ;
            }
                        if (rows.length)
                        {
                                console.log('認證成功');
                                return true;
                        }
                        else
                        {
                                console.log('認證失敗');
                                return false;
                        }
        });
}

if (auth(username)) <==不會為 true
{
    //do........
}

最近為了完成這個專案,沒眠沒夜的在看資料還有 try code ,忽略了結婚不到一年的老婆(一直被唸說假日不帶她出門),再加上與我家人相處的小問題,她在近日提出離婚,我也回答尊重她的想法,她又要求我暫時不要給家人知道,只好順便附上這小段牢騷,哀...這麼努力是為了誰...還不是為了撐住這個家

[daidai 在  2013-7-22 09:18 AM 作了最後編輯]
發表人: ericshliao    時間: 2013-7-21 10:56 PM

db_connection.query("SELECT * FROM `zp_machine` LEFT JOIN `zp_customer` ON `zpm_zpc_id` = `zpc_id` WHERE `zpm_sn` =?",[username], function(err, rows, fields)

是我眼花了嗎? 這行的括號好像沒對稱
發表人: rayon    時間: 2013-7-22 12:41 AM

沒小孩就簡單得多.....
發表人: cbc    時間: 2013-7-22 09:18 AM

沒在用 nodejs 不過那個 return true 及 false 放在那個 function 應該不是  auth 的回傳

把 //do 的內容用成匿名 function 傳給 auth , 之後在 auth 中 把 sql 的結果傳給他 run?



看了一下 async.js ,如果要給其他懂 nodejs 的人看,你貼一下你實作的邏輯我想會更好
用 async 跑有順序的 function 用在你的例子好像會更費事的感覺

以上為不懂 node js 的情況下,給的想法

[cbc 在  2013-7-22 09:22 AM 作了最後編輯]
發表人: ericshliao    時間: 2013-7-22 12:08 PM

因為那一行括號不對稱,出現err,然後進入後面的err condition裡,一定會return false...
            if(err){
                console.log(err);
                return ;
            }
發表人: 335012    時間: 2013-7-22 07:21 PM

這裡問問?

婚姻的問題...
小弟倒覺得加減反映給上司知道一下....
別把一堆工作都派給您...
發表人: daidai    時間: 2013-7-23 01:07 AM

此段為 callback function
function(err, rows, fields) {
            if(err){
                console.log(err);
                return ;
            }
                        if (rows.length)
                        {
                                console.log('認證成功');
                                return true;
                        }
                        else
                        {
                                console.log('認證失敗');
                                return false;
                        }
        }

相關說明Node.js 台灣社群協作電子書
發表人: ash11tw    時間: 2013-7-31 05:35 AM

nodejs基本上都是async的
所有東西都要在callback裡面跑

db_connection.query("SELECT * FROM `zp_machine` LEFT JOIN `zp_customer` ON `zpm_zpc_id` = `zpc_id` WHERE `zpm_sn` =?",[username], function(err, rows, fields) {
           //callback通常會回傳兩個值
          //第一個通常是error
          //所以一開始會檢測這個
            if(err){
                console.log(err);
                return ;
            }
           //接下來是從mysql取出來的值
                        if (rows.length)
                        {
                                console.log('認證成功');
                                return true;
                        }
                        else
                        {
                                console.log('認證失敗');
                                return false;
                        }
                      假如你有接下來認證的code要寫在這裡
                     if (auth(username)) <==不會為 true
                     {
                         //do........
                     }
        });

基本上 nodejs is an event driven structure so every result is passed to callback function for  next step
發表人: daidai    時間: 2013-8-2 03:51 PM


引用:
ash11tw寫到:
nodejs基本上都是async的
所有東西都要在callback裡面跑

db_connection.query("SELECT * FROM `zp_machine` LEFT JOIN `zp_customer` ON `zpm_zpc_id` = `zpc_id` WHERE `zpm_sn` =?",[username], function(err, rows, fields) {
           //callback通常會回傳兩個值
          //第一個通常是error
          //所以一開始會檢測這個
            if(err){
                console.log(err);
                return ;
            }
           //接下來是從mysql取出來的值
                        if (rows.length)
                        {
                                console.log('認證成功');
                                return true;
                        }
                        else
                        {
                                console.log('認證失敗');
                                return false;
                        }
                      假如你有接下來認證的code要寫在這裡
                     if (auth(username)) <==不會為 true
                     {
                         //do........
                     }
        });

基本上 nodejs is an event driven structure so every result is passed to callback function for  next step


謝謝你的回應,不過我暫時不會想去試了~等我整理好心情和房間內舒適的辦公桌椅...
老婆目前已經成前妻,工作部份我也遞辭呈了,該是換個新環境了
發表人: Ailio    時間: 2013-8-6 10:17 AM

真遺憾最後的結果是這樣

不過危機也可能是轉機

預祝驢友您能早日撥雲見日 人生的旅途與職場上都能找到新的方向
發表人: chrixtal    時間: 2014-5-24 07:50 AM

結婚不到一年就分啦...

恭喜你回復自由之身!
發表人: torpedo    時間: 2015-4-20 04:01 AM


引用:
daidai寫到:


謝謝你的回應,不過我暫時不會想去試了~等我整理好心情和房間內舒適的辦公桌椅...
老婆目前已經成前妻,工作部份我也遞辭呈了,該是換個新環境了

氣魄.............工作真的也該有個限度
除了吃飽,心情也很重要
有錢沒地方花也是徒然

另一伴也是很麻煩

有的嫌沒時間陪她
有的很抱怨家用
有的又閒你工作態度,沒有專心在上面,沒有上進心
(像我就是作到死.....被強迫從另一行興趣轉到網頁程式[.....相信偶這就是老闆的心態]
以後還要面對程式的進步....拜託,誰那麼無敵能當永遠的明星員工.......你生病家裡有事....誰裡你)

前陣子看物件程式的設計
看得我頭痛了好久好久.........除了物件設計觀念
還有如何設計class.........還有例如商品類別樹的建構(用遞迴)
但老闆只是冷眼激你看你行不行....行就多給錢再繼續鞭策你
反正就是給錢.....他自己也不會寫.....不知道你的痛苦

拜託40了頭殼都快燒壞了

台灣老闆都這麼愛操人嗎?

真的是很討厭.........

對啦
找個好相處,個性隨和,有同情心的對象比較重要

這樣大家比較能相處愉快互相包容幫忙

若沒有緣份遇到(好)對象就算了.....何必找麻煩......反正生理衝動過去就好了

[torpedo 在  2015-4-20 04:36 AM 作了最後編輯]
發表人: torpedo    時間: 2015-4-20 04:40 AM


引用:
daidai寫到:
請教有使用過 node.js 存取 mysql 的版友,同步及非同步問題

最近公司主管挖了個洞給我跳,要我做遊戲伺服器,在上位的主管認為不過就是個聊天室,但是沒想到底層協定的應用及遊戲客戶端同步接收訊息的問題,單機版的遊戲已經出貨出去,還跟客戶承諾後續會更新成連線版。小弟我的本職是網頁程式設計師,用PHP設計公司網頁及系統,找遍了 google 相關文章,實在想不出問題點在哪,所以特來請教大家一些觀念

我用 node.js 及 socket.io(支援多種協定及現成的 room 及廣播機制) 實做聊天室訊息推播架構,想把這個應用在遊戲伺服器的同步訊息收發,使用 websocket 協定,在做連線驗證機制時,碰到了難題,
以下的函式都沒回傳值,我大概知道是同步、非同步問題,也嘗試使用 https://github.com/caolan/async (async.js) 這個套件,不過始終實做不出來,麻煩大家了,感謝

function auth(username)
{
        // 引入 mysql connect
        var config = require("./mysql_db.js");
        var db_connection = config.db;

        db_connection.query("SELECT * FROM `zp_machine` LEFT JOIN `zp_customer` ON `zpm_zpc_id` = `zpc_id` WHERE `zpm_sn` =?",[username], function(err, rows, fields) {
            if(err){
                console.log(err);
                return ;
            }
                        if (rows.length)
                        {
                                console.log('認證成功');
                                return true;
                        }
                        else
                        {
                                console.log('認證失敗');
                                return false;
                        }
        });
}

if (auth(username)) <==不會為 true
{
    //do........
}

最近為了完成這個專案,沒眠沒夜的在看資料還有 try code ,忽略了結婚不到一年的老婆(一直被唸說假日不帶她出門),再加上與我家人相處的小問題,她在近日提出離婚,我也回答尊重她的想法,她又要求我暫時不要給家人知道,只好順便附上這小段牢騷,哀...這麼努力是為了誰...還不是為了撐住這個家

[daidai 在  2013-7-22 09:18 AM 作了最後編輯]

對了請問大大這是哪加公司啊?
偶再過一陣子要找新工作
不想踩到這地雷




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0