当部署到云端时,无法在node.js中向azure存储表添加实体



我正在使用socket。IO在node.js实现聊天功能在我的azure云项目。在其中,我一直在使用node.js将用户聊天记录添加到表中。当我在本地模拟器上运行它时,它工作得很好,但奇怪的是,当我部署到我的azure云时,它不工作,也不抛出任何错误,所以它真的令人难以置信。下面是我的代码。

 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");
    }        
});
}

它在我的本地模拟器上工作,但不是在云上,我遇到了一个读数,一个实体的DateTime变量在创建云表上的记录时不应该为空。但是我很确定我传递时间戳的方式是好的,对吗?还有其他的想法吗?为什么它只能在本地运行,而不能在云上运行?

编辑:

当我运行套接字时,我也得到了这个错误。IO服务器,但尽管有这个错误,套接字。IO功能工作良好,所以我没有费心去关心它。我根本不知道这个错误是什么意思。

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

几件事:

  • 你不需要设置时间戳,当你插入一条记录时,服务应该自动填充它。

  • 在本地运行时,您可以将环境变量设置为Windows Azure存储帐户设置,并查看在开发人员机器上运行时是否会成功写入表。而不是在模拟器中运行,只需设置环境变量并直接使用node.exe运行应用程序。

您是在web角色还是worker角色中运行?既然你提到了模拟器,我猜它是云服务。如果它是一个工作者角色,可以添加一些工具记录到文件中,以帮助调试。如果它是一个web角色,你可以添加iisnode。在应用程序根目录下的Yml文件中,使用以下行来启用stdout/stderr的日志记录:

loggingEnabled: true

这将捕获stdout/stderr到web角色实例的e:或f:上的批准文件夹下的iislog文件夹。您可以远程桌面到实例,并查看日志,以查看成功插入的日志是否正在发生。

否则,从上面的代码中看不出发生了什么。类似的代码对我来说工作得很好。我的测试代码的相关部分可以在https://gist.github.com/Blackmist/5326756找到。

最新更新