RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [javascript] 請教 node.js 及 socket.io 存取 mysql 資料庫同步、非同步問題   字型大小:||| 
daidai
鐵驢友〔中級〕
等級: 5等級: 5


 . 積分: 51
 . 文章: 80
 . 收花: 325 支
 . 送花: 166 支
 . 比例: 0.51
 . 在線: 1631 小時
 . 瀏覽: 13352 頁
 . 註冊: 7086
 . 失蹤: 579
#1 : 2013-7-21 08:35 PM     只看本作者 引言回覆

請教有使用過 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 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
ericshliao
銀驢友〔高級〕
等級: 14等級: 14等級: 14等級: 14


今日心情

 . 積分: 849
 . 精華: 2
 . 文章: 1589
 . 收花: 7188 支
 . 送花: 5723 支
 . 比例: 0.8
 . 在線: 5412 小時
 . 瀏覽: 20831 頁
 . 註冊: 6743
 . 失蹤: 3244
#2 : 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)

是我眼花了嗎? 這行的括號好像沒對稱



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
rayon
銅驢友〔高級〕
等級: 10等級: 10等級: 10


十週年紀念徽章(五級)  

今日心情

 . 積分: 177
 . 文章: 390
 . 收花: 1206 支
 . 送花: 2694 支
 . 比例: 2.23
 . 在線: 1566 小時
 . 瀏覽: 38302 頁
 . 註冊: 6836
 . 失蹤: 23
 . TWed2k-DVD幫
#3 : 2013-7-22 12:41 AM     只看本作者 引言回覆

沒小孩就簡單得多.....


[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
cbc
青銅驢友
等級: 11等級: 11等級: 11等級: 11


 . 積分: 252
 . 精華: 3
 . 文章: 262
 . 收花: 1949 支
 . 送花: 374 支
 . 比例: 0.19
 . 在線: 2664 小時
 . 瀏覽: 24410 頁
 . 註冊: 6892
 . 失蹤: 719
#4 : 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 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
ericshliao
銀驢友〔高級〕
等級: 14等級: 14等級: 14等級: 14


今日心情

 . 積分: 849
 . 精華: 2
 . 文章: 1589
 . 收花: 7188 支
 . 送花: 5723 支
 . 比例: 0.8
 . 在線: 5412 小時
 . 瀏覽: 20831 頁
 . 註冊: 6743
 . 失蹤: 3244
#5 : 2013-7-22 12:08 PM     只看本作者 引言回覆

因為那一行括號不對稱,出現err,然後進入後面的err condition裡,一定會return false...
            if(err){
                console.log(err);
                return ;
            }



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
335012
銀驢友〔初級〕
等級: 12等級: 12等級: 12
英雄檸檬

今日心情

 . 積分: 391
 . 文章: 1008
 . 收花: 3299 支
 . 送花: 20293 支
 . 比例: 6.15
 . 在線: 2097 小時
 . 瀏覽: 16930 頁
 . 註冊: 7196
 . 失蹤: 350
 . 台南市仁德區
#6 : 2013-7-22 07:21 PM     只看本作者 引言回覆

這裡問問?

婚姻的問題...
小弟倒覺得加減反映給上司知道一下....
別把一堆工作都派給您...



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
daidai
鐵驢友〔中級〕
等級: 5等級: 5


 . 積分: 51
 . 文章: 80
 . 收花: 325 支
 . 送花: 166 支
 . 比例: 0.51
 . 在線: 1631 小時
 . 瀏覽: 13352 頁
 . 註冊: 7086
 . 失蹤: 579
#7 : 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 台灣社群協作電子書



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
ash11tw
鐵驢友〔初級〕
等級: 4


今日心情

 . 積分: 32
 . 文章: 33
 . 收花: 232 支
 . 送花: 45 支
 . 比例: 0.19
 . 在線: 2864 小時
 . 瀏覽: 8220 頁
 . 註冊: 6887
 . 失蹤: 0
#8 : 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



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
daidai
鐵驢友〔中級〕
等級: 5等級: 5


 . 積分: 51
 . 文章: 80
 . 收花: 325 支
 . 送花: 166 支
 . 比例: 0.51
 . 在線: 1631 小時
 . 瀏覽: 13352 頁
 . 註冊: 7086
 . 失蹤: 579
#9 : 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


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



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
Ailio
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30
鸚鵡螺號 艦長

十週年紀念徽章(五級)  

今日心情

 . 積分: 2664
 . 文章: 6462
 . 收花: 22900 支
 . 送花: 4903 支
 . 比例: 0.21
 . 在線: 2826 小時
 . 瀏覽: 85748 頁
 . 註冊: 7211
 . 失蹤: 15
 . 莫名奇妙的商人星球
#10 : 2013-8-6 10:17 AM     只看本作者 引言回覆

真遺憾最後的結果是這樣

不過危機也可能是轉機

預祝驢友您能早日撥雲見日 人生的旅途與職場上都能找到新的方向



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
chrixtal
銅驢友〔高級〕
等級: 10等級: 10等級: 10


十週年紀念徽章(六級)  

今日心情

 . 積分: 179
 . 文章: 902
 . 收花: 1311 支
 . 送花: 3001 支
 . 比例: 2.29
 . 在線: 248 小時
 . 瀏覽: 4493 頁
 . 註冊: 7926
 . 失蹤: 7
#11 : 2014-5-24 07:50 AM     只看本作者 引言回覆

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

恭喜你回復自由之身!



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
torpedo
鐵驢友〔初級〕
等級: 4


 . 積分: 38
 . 文章: 77
 . 收花: 133 支
 . 送花: 411 支
 . 比例: 3.09
 . 在線: 364 小時
 . 瀏覽: 20051 頁
 . 註冊: 7069
 . 失蹤: 159
 . Taipei
#12 : 2015-4-20 04:01 AM     只看本作者 引言回覆


引用:
daidai寫到:


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

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

另一伴也是很麻煩

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

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

拜託40了頭殼都快燒壞了

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

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

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

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

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

[torpedo 在  2015-4-20 04:36 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
torpedo
鐵驢友〔初級〕
等級: 4


 . 積分: 38
 . 文章: 77
 . 收花: 133 支
 . 送花: 411 支
 . 比例: 3.09
 . 在線: 364 小時
 . 瀏覽: 20051 頁
 . 註冊: 7069
 . 失蹤: 159
 . Taipei
#13 : 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 作了最後編輯]

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



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記

   

快速回覆
表情符號

更多 Smilies

字型大小 : |||      [完成後可按 Ctrl+Enter 發佈]        

溫馨提示:本區開放遊客瀏覽。
選項:
關閉 URL 識別    關閉 表情符號    關閉 Discuz! 代碼    使用個人簽名    接收新回覆信件通知
發表時自動複製內容   [立即複製] (IE only)


 



所在時區為 GMT+8, 現在時間是 2024-3-28 10:21 PM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.038386 second(s), 8 queries , Qzip disabled