为啥使用不同文件快速路由不起作用?

Posted

技术标签:

【中文标题】为啥使用不同文件快速路由不起作用?【英文标题】:Why routing in express using different files doesn't work?为什么使用不同文件快速路由不起作用? 【发布时间】:2016-12-06 01:02:42 【问题描述】:

我正在尝试模块化我的应用程序分离路由,但唯一有效的是根路由,我不知道我的代码有什么问题,在阅读Express Routing之后,我的代码似乎是写的正确

app.js

// ...
var routes = require('./routes/index');
var users = require('./routes/users');
//Require the external route
var about = require('./routes/about');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

//Routes
app.use('/', routes);
app.use('/users', users);
//The external route 
app.use('login', login);

index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) 
  res.render('index',  title: 'Clazapp' );
);

module.exports = router;

login.js

var express = require('express');
var router = express.Router();

  //login page
  router.get("/login", function(req, res, next) 
    res.render('login');
  );

module.exports = router;

如您所见,login.js 和 index.js 的代码几乎相同,但是 /login 路由不起作用。出现消息:

错误:无法在视图目录中查找视图“错误” EventEmitter.render 中的“/home/cesar/Documentos/node/clazapp2/views” (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/application.js:579:17) 在 ServerResponse.render (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/response.js:961:7) 在 /home/cesar/Documentos/node/clazapp2/app.js:61:7 在 Layer.handle_error (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/layer.js:71:5) 在 trim_prefix (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/index.js:310:13) 在 /home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/index.js:280:7 在 Function.process_params (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/index.js:330:12) 在 IncomingMessage.next (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/router/index.js:271:10) 完成时 (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/response.js:956:25) 在 EventEmitter.render (/home/cesar/Documentos/node/clazapp2/node_modules/express/lib/application.js:581:14)

似乎没有找到文件login.jade,但他已经位于目录/views 中。这么复杂,有什么想法吗?

【问题讨论】:

您希望 login.js 路由适用于哪个确切的 URL? @jfriend00 我需要得到login.jade,就这么简单。 呵呵。我问您希望您的登录路径适用于哪个 URL。请用完整的 URL 回答。我之所以问是因为app.use('login', login); 似乎是错误的,但我想知道您希望使用哪个 URL,然后再提供有关路线代码应该是什么的建议? 【参考方案1】:

据我所知,express.Router() 只能用于特殊情况。 我使用下一种方式来模块化应用程序

// app.js
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
...
require('./routes')(app); // it's call ./routes/index.js and pass app to it

// ./routes/index.js
var smthEntity = require('./smthEntity');

module.exports = function (app) 
    app.get('/smth-path', ...smth, e.g. checkAuth, ...);
    app.get('/smthEntity', smthEntity.get);

    app.get('/login', require('./login').get);
    app.post('/login', require('./login').post));


// ./routes/smthEntity
var SmthEntity = require ('smthEntity'); // include models

exports.get = function(req, res, next) 
    res.render('smthEntity.html', 
        arg1: value1,
        arg2: value2
    ); 
;
... // other method and route for smthEntity

// ./routes/login
exports.get = function(req, res, next) 
    res.render('login.html',  ... );  
;

exports.post = function(req, res, next) 
    ...process post data...
;

【讨论】:

以上是关于为啥使用不同文件快速路由不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥路由器链接不起作用,尽管我使用与 href 相同的组件链接并且它可以工作?

为啥我的属性路由不起作用?

为啥 react-router-dom 自定义路由不起作用?

为啥 Laravel 发布方法在路由器页面上不起作用?

在 Ionic 中,为啥路由在 iPhone 上不起作用,但在构建版本和离子服务上起作用

使用zuul路由到docker中的不同容器不起作用