ExpressJS 4.0导出路由,获取TypeError

时间:2014-07-08 09:15:06

标签: node.js express node-postgres

根据下面提供的代码解决以下错误的任何建议都将不胜感激,因为我只是迷失在这里:

~/public_html/server/routes/api.js:10
api.use(function(req, res, next){
    ^
TypeError: Cannot call method 'use' of undefined
    at Object.<anonymous> (~/public_html/server/routes/api.js:10:5)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (~/public_html/server/server.js:72:17)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)

首先,这是我的app目录的相关结构:

- 的public_html
  --node_modules
     - 表达     
--pg     
--body分析器   
--server     
--routes       
api.js       
index.js       
server.js

我在server.js中为我的路线设置了一个基本的快递应用程序:

// server.js
var express = require('../node_modules/express'),
    app = express(),
    bodyParser = require('../node_modules/body-parser'),

app.set('port', 3000);
app.use(bodyParser);

app.use('/api', require('./routes/api').api);
app.use('/', require('./routes/index').index);

// Start server
app.listen(app.get('port'), function () {
    console.log("listening on port %d in %s mode", app.get('port'), app.settings.env);
});

然后,在我的api.js中,我创建了路由并定义了必要的HTTP动词。我将在这里显示1 .get call:

// api.js
var pg = require('../../node_modules/pg'),
express = require('../../node_modules/express'),
connString = "postgres://db_user:xxxx@localhost:5432/db_name";

var api = express.Router();

api.use(function(req, res, next){
  console.log('in api.js...');
  next();
});

api.get('getUsers', function(req, res) {
  pg.connect(connString, function(err, client, done) {
  if (err) {
    console.error("Error fetching client from pool", err);
  } else {
    client.query('SELECT * FROM users', 
      function(err, result) {
          done();
          if (err) {
              console.error("Error querying database", err);
          } else {
              res.json(result[0]);
          }
      });
    }
  });
});

module.exports.api = api;

1 个答案:

答案 0 :(得分:1)

这里的问题是你需要依赖的方式。由于它们是您在项目中安装的节点包,因此您无需通过其文件路径引用它们。实际上,如果您引用了错误的文件名,它可能会导致问题(当您引用文件夹时,它会自动尝试从该文件夹加载index.js)。

因此,在server.js文件中,请更改此内容:

var express = require('../node_modules/express'),
    app = express(),
    bodyParser = require('../node_modules/body-parser');

对此:

var express = require('express'),
    app = express(),
    bodyParser = require('body-parser');

在您加载已安装的节点包的依赖项的其他位置也进行类似的更改。 (请注意:如果您引用了在项目中创建的本地文件,则需要按文件位置引用它。)

有关Node如何通过require加载文件的更多信息,请参阅文档:http://nodejs.org/api/modules.html#modules_all_together