2013-04-01 20 views
1

我正在使用Node.js的socket.io在我的Azure雲項目來落實聊天功能。在它中,我一直使用node.js將用戶聊天記錄添加到表格中。它工作正常,當我在我的本地模擬器上運行它,但奇怪的是,當我部署到我的天藍色的雲,它不工作,並沒有拋出任何錯誤,所以它真的讓人難以置信。以下是我的代碼。將節點部署到雲時,無法將實體添加到node.js中的天藍色存儲表中?

var app = require('express')() 
    , server = require('http').createServer(app) 
    , sio = require('socket.io') 
, redis = require('redis'); 

var client = redis.createClient(); 
var io = sio.listen(server,{origins: '*:*'}); 

io.set("store", new sio.RedisStore); 

process.env.AZURE_STORAGE_ACCOUNT = "account"; 
process.env.AZURE_STORAGE_ACCESS_KEY = "key"; 

var azure = require('azure'); 
var chatTableService = azure.createTableService(); 

createTable("ChatUser"); 

server.listen(4002); 

socket.on('privateChat', function (data) {   
    var receiver = data.Receiver; 
    console.log(data.Username); 

    var chatGUID1 = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 
     var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); 
     return v.toString(16); 
    }); 

var chatRecord1 = { 
     PartitionKey: data.Receiver, 
     RowKey: data.Username, 
     ChatID: chatGUID2, 
     Username: data.Receiver, 
     ChattedWithUsername: data.Username, 
     Timestamp: new Date(new Date().getTime()) 
    }; 
    console.log(chatRecord1.Timestamp); 

    queryEntity(chatRecord1); 
} 

function queryEntity(record1) { 
chatTableService.queryEntity('ChatUser' 
, record1.PartitionKey 
, record1.RowKey 
, function (error, entity) { 
    if (!error) { 
     console.log("Entity already exists") 
    } 
    else { 
     insertEntity(record1);    
    } 
})  
} 

function insertEntity(record) { 
chatTableService.insertEntity('ChatUser', record, function (error) { 
    if (!error) { 
     console.log("Entity inserted"); 
    }   
}); 
} 

它的工作在我的本地模擬器但不是在雲和我碰到一個閱讀,創建雲表中的記錄時的實體的日期時間變量不應爲空來了。但我很確定傳遞時間戳的方式沒問題,它是正確的?任何其他想法,爲什麼它可能在本地而不是在雲上工作?

編輯:

當我運行socket.io服務器我甲肝也已經收到此錯誤,但儘管有這種錯誤的socket.io功能工作正常,所以我並沒有刻意去關心它。我不知道錯誤意味着什麼。

{ [Error: connect ECONNREFUSED] 
    code: 'ECONNREFUSED', 
    errno: 'ECONNREFUSED', 
    syscall: 'connect' } 

回答

2

兩件事情:

  • 你不應該需要設置時間戳,應將服務時,會自動插入一條記錄填充這一點。

  • 當運行在本地就可以設置環境變量到Windows Azure存儲帳戶設置,看看在你的開發機器上運行時,它會成功寫入表。不要在模擬器中運行,只需設置環境變量並直接使用node.exe運行應用程序。

您是否在Web角色或輔助角色中運行?自從您提到模擬器以來,我假設它是一項雲服務。如果它是一個工作者角色,可能需要添加一些工具來記錄文件以協助調試。如果它是一個Web角色,你可以在文件中的應用程序的根添加iisnode.yml文件,具有以下行來啓用標準輸出/標準錯誤日誌:

loggingEnabled: true 

這將捕獲標準輸出/標準錯誤到iislog文件夾位於Web角色實例的e:或f:處的approot文件夾下。您可以遠程桌面到實例並查看日誌以查看是否發生了成功插入的日誌。

否則,它不是從上面發生了什麼事情的代碼明顯。類似的代碼爲我工作得很好。我的測試代碼的相關位可以在https://gist.github.com/Blackmist/5326756找到。

希望這會有所幫助。

+0

首先,非常感謝您詳細的解答!雅我曾嘗試設置環境變量到我的本地天藍色存儲,它的工作原理。當我通過在Web角色上執行RDP直接從node.exe運行node.js腳本時,它也可以工作。但是當iisnode處理node.js腳本時它不起作用。奇怪! – Bitsian

+0

我在E:目錄和approot中都放了一個iisnode.yml,但在approot文件夾中沒有日誌。我應該把它放在哪裏? – Bitsian

+0

btw什麼是啓動socket.io服務器的最佳方式?通過命令提示符或通過iisnode? – Bitsian

相關問題