node.js - 部署到云时无法将实体添加到 Node.js 中的 Azure 存储表中?

标签 node.js azure guid azure-storage azure-table-storage

我正在使用node.js中的socket.io在我的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 变量不应为空。但我很确定传递时间戳的方式没问题,对吗?还有其他想法为什么它可以在本地运行但不能在云端运行吗?

编辑:

我在运行socket.io服务器时也遇到了这个错误,但尽管有这个错误,socket.io功能仍然工作正常,所以我没有费心去关心它。我首先不知道该错误意味着什么。

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

最佳答案

几件事:

  • 您不需要设置时间戳,该服务应该在您插入记录时自动填充该时间戳。

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

您是以 Web 角色还是辅助角色运行?自从您提到模拟器以来,我假设它是一个云服务。如果它是辅助角色,可能会添加一些工具来记录到文件以帮助调试。如果它是一个 Web 角色,您可以在应用程序的根目录中添加一个 iisnode.yml 文件,并在文件中添加以下行以启用 stdout/stderr 日志记录:

loggingEnabled: true

这会将 stdout/stderr 捕获到 Web 角色实例的 e: 或 f: 上的 approot 文件夹下的 iislog 文件夹中。您可以通过远程桌面连接到实例并查看日志以查看是否出现成功插入的日志。

否则,从上面的代码中无法明显看出发生了什么。类似的代码对我来说效果很好。我的测试代码的相关位可以在 https://gist.github.com/Blackmist/5326756 找到。 .

希望这有帮助。

关于node.js - 部署到云时无法将实体添加到 Node.js 中的 Azure 存储表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15738793/

相关文章:

batch-file - 创建了一个脚本来切换盖子关闭操作( sleep /不执行任何操作)我可以看到它生效,但它不起作用

math - 通过异或将两个 GUID 组合起来的结果是否满足成为 GUID 的条件?

node.js - forEach 中的 Node 惰性和异步函数

windows - 安装; angular-phonecat@0.0.0 预启动脚本失败

asp.net - 如何关闭 Azure 网站中的 302 重定向

azure - 逻辑应用失败,但调用此逻辑应用的 ADF 中的 Web 事件具有成功状态

xml - 为什么 Atom (RSS) id 是全局唯一的,而不是本地唯一的?

node.js - 注册帮助函数 Node.JS + Express

javascript - 使用 try/catch 和嵌套的 Promise 等待

asp.net-mvc - 并行 Blob 上传间歇性抛出 404 Bad Request