Node.js无法找到url

时间:2013-04-12 18:23:30

标签: node.js url express

我正在玩Node.js并试图发出Twitter API请求。

我正在使用Express生成的项目,所以我的app.js看起来像那样

var express = require('express')
  , routes = require('./routes')
  , http = require('http')
  , path = require('path')
  , url = require('url');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

index.js喜欢这个

exports.index = function(req, res){

  var username = 'Axiol';

  option = {
    protocol: 'http:',
    host: 'api.twitter.com',
    pathname: '/1/statuses/user_timeline.json',
    query: { screen_name: username, count: 10 }
  }

  var twitterUrl = url.format(options);

  console.log(twitterUrl);
};

看起来很好,但是,它总是把这些错误归还给我

ReferenceError: url is not defined
    at exports.index (/Users/Arnaud/Sites/badge/routes/index.js:17:20)
    at callbacks (/Users/Arnaud/Sites/badge/node_modules/express/lib/router/index.js:161:37)
    at param (/Users/Arnaud/Sites/badge/node_modules/express/lib/router/index.js:135:11)
    at pass (/Users/Arnaud/Sites/badge/node_modules/express/lib/router/index.js:142:5)
    at Router._dispatch (/Users/Arnaud/Sites/badge/node_modules/express/lib/router/index.js:170:5)
    at Object.router (/Users/Arnaud/Sites/badge/node_modules/express/lib/router/index.js:33:10)
    at next (/Users/Arnaud/Sites/badge/node_modules/express/node_modules/connect/lib/proto.js:190:15)
    at Object.methodOverride [as handle] (/Users/Arnaud/Sites/badge/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js:37:5)
    at next (/Users/Arnaud/Sites/badge/node_modules/express/node_modules/connect/lib/proto.js:190:15)
    at multipart (/Users/Arnaud/Sites/badge/node_modules/express/node_modules/connect/lib/middleware/multipart.js:64:37)

看起来无法找到url,但在app.js中已明确定义...

有什么想法吗?

2 个答案:

答案 0 :(得分:13)

您还需要在var url = require('url')文件中执行routes/index.js。我假设这是因为nodejs模块系统。每个模块都是隔离的,从外部可见的唯一事物就是你添加到exports的东西(显然是全局变量)。因此,模块中的局部变量不可用于其他模块。

答案 1 :(得分:0)

您收到错误的原因是因为“url”模块未导入index.js模块。

node.js中的每个模块都是封装的,它不会向外界公开任何内容,除非您通过导出指定它,就像使用exports.index = function(...){... }

但是,如果你这样做它将无法工作,因为Node的URL模块不是用于发出HTTP请求,而是用于处理URL。根据Node的文档:

“此模块具有用于URL解析和解析的实用程序”。见http://nodejs.org/api/url.html

如果您想向Twitter发出HTTP请求,可以使用名为“request”的Node模块,这样可以简化一些事情。见https://github.com/mikeal/request

希望这有帮助。