快速路由的行为与我预期的不一样
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');
表示。然后 router
被 module.exports
导出。与 css 文件相同的逻辑。最后,文件 index.js
在 server.js
到 app.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"));
希望对您有所帮助...
我想将所有快速路由放在与主文件不同的文件中。但是,出于某种原因,我收到一条错误消息,描述我的路径顺序错误。为什么是这样?
我的思考过程是这样的:我认为 var routes = require('./routes/index.js);
会调用文件夹 routes
中的文件 index.js
。在 index.js
内,文件将 get
服务器和 respond
通过在 views
内发送文件 tester.hbs
,由 res.sendFile(__dirname + '/views/tester.hbs');
表示。然后 router
被 module.exports
导出。与 css 文件相同的逻辑。最后,文件 index.js
在 server.js
到 app.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"));
希望对您有所帮助...