2014-05-03 100 views
0

我是node.js的新手我试图执行example。当我运行node app.js我收到这是如下图错误:TypeError:无法读取undefined属性'map'

错误

[email protected]:~/Desktop/test-projects/nodejs/example$ node app.js 
    info - socket.io started 
/home/oneadmin/Desktop/test-projects/nodejs/example/app.js:17 
    io.sockets.emit('tweets', obj.results.map(function (v) { return v.text; }) 
             ^
TypeError: Cannot read property 'map' of undefined 
    at Request._callback (/home/oneadmin/Desktop/test-projects/nodejs/example/app.js:17:42) 
    at Request.self.callback (/home/oneadmin/Desktop/test-projects/nodejs/example/node_modules/request/main.js:122:22) 
    at Request.EventEmitter.emit (events.js:107:17) 
    at Request.<anonymous> (/home/oneadmin/Desktop/test-projects/nodejs/example/node_modules/request/main.js:655:16) 
    at Request.EventEmitter.emit (events.js:126:20) 
    at IncomingMessage.<anonymous> (/home/oneadmin/Desktop/test-projects/nodejs/example/node_modules/request/main.js:617:14) 
    at IncomingMessage.EventEmitter.emit (events.js:126:20) 
    at _stream_readable.js:895:16 
    at process._tickCallback (node.js:343:11) 

app.js

var sio = require('socket.io') 
    , http = require('http') 
    , index = require('fs').readFileSync(__dirname + '/index.html') 
    , request = require('request') 

var app = http.createServer(function (req, res) { 
    res.writeHead(200, { 'Content-Type': 'text/html' }); 
    res.end(index); 
    }) 
    , io = sio.listen(app); 

setInterval(function() { 
    request({ 
    url: 'http://search.twitter.com/search.json?q=today' 
    }, function (err, res, data) { 
    var obj = JSON.parse(data); 
    io.sockets.emit('tweets', obj.results.map(function (v) { return v.text; })); 
    }); 
}, 2000); 

io.sockets.on('connection', function (socket) { 
    socket.broadcast.emit('someone connected'); 

    socket.on('some event', function() { 
    console.log('I got an event'); 
    }); 
}); 

app.listen(3000); 

的index.html

<!doctype html> 
<html> 
    <head> 
    <script src="/socket.io/socket.io.js"></script> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 

    <script> 
     var socket = io.connect(); 

     $(function() { 
     socket.on('tweets', function (tweets) { 
      $.each(tweets, function (i, tweet) { 
      $('#tweets').prepend($('<li>').text(tweet)); 
      }); 
     }); 

     socket.on('someone connected', function() { 
      $('body').prepend('<p>Someone just connected!</p>'); 
     }); 

     socket.emit('some event'); 
     }); 
    </script> 
    </head> 
    <body> 
    <h1>Tweets</h1> 
    <ul id="tweets"></ul> 
    </body> 
</html> 

任何一个帮我删除这个错误 在此先感谢!

+0

你在第16行收到正确的响应对象('''obj'''),但是这个obj不包含''''results'''字段。检查解析对象的结构('''console.log(obj)''') – 3y3

+0

你正确的....当我尝试另一个网址http://json-time.appspot.com/time.json?tz =欧洲/布鲁塞尔我得到同样的错误 –

回答

0

您可能需要使用它之前检查返回值:

if (obj && obj.results) { 
     io.sockets.emit('tweets', obj.results.map(function (v) { 
      return v.text; 
     })); 
    } 

但真正的问题是:为什么obj.results是不确定的?我检查了网址http://search.twitter.com/search.json?q=today并返回此:

{ 错误:[{ 消息: “Twitter的REST API V1不再活动请迁移到API V1.1 https://dev.twitter.com/docs/api/1.1/overview。” 代码: 64 } ] }

这就是为什么obj.results是未定义的。

相关问题