快速路由的行为与我预期的不一样

Routing in express does not behave as I expected

我想将所有快速路由放在与主文件不同的文件中。但是,出于某种原因,我收到一条错误消息,描述我的路径顺序错误。为什么是这样?

我的思考过程是这样的:我认为 var routes = require('./routes/index.js); 会调用文件夹 routes 中的文件 index.js。在 index.js 内,文件将 get 服务器和 respond 通过在 views 内发送文件 tester.hbs,由 res.sendFile(__dirname + '/views/tester.hbs'); 表示。然后 routermodule.exports 导出。与 css 文件相同的逻辑。最后,文件 index.jsserver.jsapp.use('/',routes); 中被调用。然而,在我身上发生的事情似乎是服务器查看 routes 文件但不是用 index.js 响应它进入 "further" 进入 routes 文件以找到 views/tester。我不知道这是为什么。

文件目录:

new
|
node_modules
public---tester.css
views---tester.hbs
routes---index.js
server.js
package.json
package-lock.json

错误:

Error: ENOENT: no such file or directory, stat 'C:\Users\przyb\Desktop\new\routes\views\tester.hbs'

server.js:

//Modules
var http = require('http');
var app = require('express');
var app = app();
var path = require('path');
var hbs = require('express-handlebars');
//Routes
var express = require('express');
var routes = require('./routes/index.js');
//Server
var hostname = '127.0.0.1';
var port = 8000;

//Static files
app.use(express.static(path.join(__dirname +'views')));
app.use(express.static(path.join(__dirname +'public')));
app.use('/',routes);


//View engine setup
app.engine('hbs', hbs({extname: 'hbs', defaultLayout: 'tester', layoutsDir: __dirname + '/views'}));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

//Live server
var server = http.createServer(function(req,res){
    res.statusCode = 200;
    res.setHeader('Content-Type','text/html');
    res.end('Still in server.js');
});

app.listen(8000);

module.exports = app;
var express = require('express');
var router = express.Router();
var path = require('path');
var app = require('express')();

router.get('/', function(req,res,next){
    res.sendFile(__dirname + '/views/tester.html');

});
router.get('/', function(req,res,next){
    res.sendFile(__dirname + '/public/tester.css');
});


module.exports = router;

我希望服务器通过 var routes = require('./routes/index.js');app.use('/',routes); 调查 routes/index.js 并从那里 index.js 调用 views/tester.hbs,尽管这不是案.

将所有路由写入单个文件是一种糟糕的方法。进行路由的最佳方法是在单独的文件中。它会像 routes/routingfiles。你的索引路由文件会像这样。

const glob = require('glob');

const routes = [];
glob.sync( './server/routes/**/*.js' ).forEach( function( file ) {
    if(!(file.includes("index"))){
        routes.push(file.replace('/server',''));
    }
  });

module.exports = routes;

然后在 app.js 你需要这样做。

routes.forEach(function(route) {
    let controller = require(route);
    app.use("/", controller);
});

这是在单独的文件中路由的正确方法。如果您需要更多帮助,可以使用此 Node Project Git Repo.

您正在发送路径 __dirname + views/tester.html 中的文件。 __dirname 为您提供当前文件的路径,即您的 routes 文件夹,然后您说要在 views 文件夹中获取 tester.html,但 routes 不包含任何名为 views 的文件夹。因此,在 __dirname 之后,您需要返回一级,然后转到 views/tester.hbs.

res.sendFile(path.join(__dirname + "/../views/tester.hbs"));
res.sendFile(path.join(__dirname + "/../public/tester.css"));

希望对您有所帮助...