无法GET路由express / nodejs

时间:2018-01-08 02:26:13

标签: javascript node.js express

我正在学习更多关于API的知识,所以我决定为啤酒/啤酒厂建立一个简单的API,它工作得很好然后突然没有路由可行。我通过创建一个纯粹用于测试此问题的新路线来测试它,它运行正常。所以,我简化了我的其他路由,只是用res.send()将消息发送回DOM,看看是否切断数据库连接可以帮助我查明问题。

此测试路由通过向DOM发送消息“hello!”按预期工作。 (/app/routes/test_routes.js):

module.exports = function(app, db) {
  app.get('/test', (req, res) => {
    res.send("hello!");
  });
};

然而,尽管功能相同(/app/routes/brewery_routes.js),但这根本不起作用:

module.exports = function(app, db) {
  app.get('/brewery', (req, res) => {
    res.send("hello!");
  });
};

这是拉出(/app/routes/index.js)所有路线的路线索引:

const beerRoutes = require('./beer_routes');
module.exports = function(app, db) {
  beerRoutes(app, db);
};

const breweryRoutes = require('./brewery_routes');
module.exports = function(app, db) {
  breweryRoutes(app, db);
};

const cityRoutes = require('./city_routes');
module.exports = function(app, db) {
  cityRoutes(app, db);
};

const testRoutes = require('./test_routes');
module.exports = function(app, db) {
  testRoutes(app, db);
};

这是我的服务器文件,它处理所有路由(/server.js):

const express     = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser  = require('body-parser');
const app         = express();
const db          = require('./config/db');

const PORT = 8000;

app.use(bodyParser.urlencoded({ extended: true }));

MongoClient.connect(db.url,(err, database) =>{

  if (err) {
    return console.log(err)
  }

  require('./app/routes')(app, database);

  app.listen(PORT, () => {
    console.log("We are pouring beer at port " + PORT);
  });
});

我的应用程序的常规文件结构是:

Root/ 
  app/
    routes/
      index.js
      test_routes.js
      brewery_routes.js
      beer_routes.js
      city_routes.js
  server.js

当我查看控制台日志时,我看到/test路由没有错误,但是其他路由返回了这个庞大的字体错误列表,这有点奇怪。你可以通过我的代码看到我没有加载任何字体,所以我想知道这是否是一个比我所知的更大的问题。

enter image description here

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

index.js中,您可以反复为module.exports分配多个内容。只有最后一个才能生存,并且可供需要该模块的人使用。您没有显示加载index.js的代码并尝试使用这些路由,所以我不知道正确的解决方案是什么,但这肯定解释了为什么只有index.js中的最后一个路由/app/routes/test_routes.js才能永远的工作。

因此,module.exports的每个分配都会覆盖前一个分配。只有最后一个存活并实际导出:

const beerRoutes = require('./beer_routes');
module.exports = function(app, db) {
  beerRoutes(app, db);
};

const breweryRoutes = require('./brewery_routes');
module.exports = function(app, db) {
  breweryRoutes(app, db);
};

const cityRoutes = require('./city_routes');
module.exports = function(app, db) {
  cityRoutes(app, db);
};

const testRoutes = require('./test_routes');
module.exports = function(app, db) {
  testRoutes(app, db);
};

这就像:

let a;

a = function() { console.log("1"); }
a = function() { console.log("2"); }

a();    // outputs "2"

这可能是你想要的:

module.exports = function(app, db) {
    require('./beer_routes')(app, db);
    require('./brewery_routes')(app, db);
    require('./city_routes')(app, db);
    require('./test_routes')(app, db);
}

然后,当加载模块并调用构造函数时,您将初始化所有这些路径。