使用Node.js通过AJAX请求从Redis中检索数据

我正在阅读NodeExpressSocket.io聊天教程。 我决定使用Redis存储聊天logging,并成功设置,以便我的信息正确发布到数据库。 我正在尝试访问这些信息以在客户端使用(在这种情况下,我正在尝试访问当前在聊天中的用户列表,以便我可以将它们显示在聊天的一侧)。 我正在使用$.getJSON进行GET请求。 现在我已经安装了,它试图访问的文件只有这个JSON对象: {"dog" : "2","cat":"3"}只是为了testing它,这是工作,我不知道从哪里去,因为任何时候我尝试添加一个函数到该文件,即使我指定返回一个JSON对象并调用该函数,请求停止返回正确的信息。

例如,我试过:

 var data = function(){ return {"dog" : "2","cat":"3"} } data(); 

这不会返回任何东西(我明白,当我做一个GET请求函数不运行,但它甚至不会返回该文本,如果它不运行一个函数,我不知道如何我可以从这个文件访问redis)

这是我在想什么:

 var redis = require('redis') //figure out how to access the redis client that I have at localhost:6379, something like var db = redis.X //and then call (for example) db.smembers('onlineUsers') and be returned the object which I can iterate through 

这是我的相关代码:

server.js:

 var jade = require('jade'); var PORT = 8080; var redis = require('redis'); var db = redis.createClient(); var pub = redis.createClient(); var sub = redis.createClient(); var http = require('http'); var express = require('express'); var app = express(); var server = http.createServer(app); var io = require('socket.io').listen(server); server.listen(PORT, function(){ console.log("Now connected on localhost:" + PORT) }); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.set("view options", {layout: false}); app.use(express.static(__dirname + '/public')); app.get('/', function(req, res){ res.render('home'); }); io.sockets.on('connection', function(client){ sub.subscribe("chatting"); sub.on("message", function (channel, message) { console.log("message received on server from publish"); client.send(message); }); client.on("sendMessage", function(msg) { pub.publish("chatting",msg); }); client.on("setUsername", function(user){ pub.publish("chatting","A new user in connected:" + user); db.sadd("onlineUsers",user); } ); client.on('disconnect', function () { sub.quit(); pub.publish("chatting","User is disconnected :" + client.id); }); }); 

script.js:

 $(document).ready( function(){ $client = io.connect(); initialize(); }); var setUsername = function(){ var username = $("#usernameInput").val(); if (username) { var user = username; $client.emit('setUsername', username); $('#chatControls').show(); $('#usernameInput').hide(); $('#usernameSet').hide(); showCurrentUsers(); } } var showCurrentUsers = function(){ $('#list_of_users').empty(); $.getJSON('getusers.js', function(data){ for (var i = 0; i < data.length; i++){ $('list_of_users').append("<li>"+data[i]+"</li>") } }) } var sendMessage = function(){ var msg = $('#messageInput').val(); var username = $("#usernameInput").val(); if (msg) { var data = {msg: msg, user: username} $client.emit('message', data); addMessage(data); $('#messageInput').val(''); // populate(username,msg); } } var addMessage = function(data) { $("#chatEntries").append('<div class="message"><p>' + data.user + ' : ' + data.msg + '</p></div>'); } // var populate = function(username,msg) { // var data ; // } var initialize = function(){ $("#chatControls").hide(); $("#usernameSet").on('click', setUsername); $("#submit").on('click',sendMessage); showCurrentUsers(); } 

现在所有的getusers.js文件都是这样的:

{"dog" : "2","cat":"3"}

它看起来像你期待您的电话$ .getJSON来加载和执行它加载的JavaScript。 它不这样工作。 您需要制作一个呈现JSON的节点端点(通过路由)。 然后节点端点将执行数据操作/查询redis:

节点:

在routes.js中:

 app.get('/chatdata', ChatController.getChatData); 

在ChatController.js(操纵,创build数据,你喜欢这里)

 exports.getChatData = function (req, res) { var data = function(){ return {"dog" : "2","cat":"3"} }; res.JSON(data); }; 

前端

 $.getJSON('getChatData', function(data){ //... }) 

我想你需要设置一个路由来处理$ .getJSON所做的GET请求,或者如果getusers.js位于/ public目录中,那么你需要修改$ .getJSON调用,如下所示:

$.getJSON('http://localhost:8080/public/getusers.js', function(data){

好吧,它看起来像是你的getusers.js文件的问题。 $ .getJSON似乎更喜欢双引号。 尝试像这样格式化:

{ "dog" : "2", "cat" : "3" }

另外,尝试使用它来显示数据:

  $.getJSON('getusers.js', function(data){ var items = []; $.each( data, function( key, val ) { items.push("<li id='" + key + "'>" + val +"</li>"); }); $('#list_of_users').append(items.join("")); });