Node / express中的路由
Posted
技术标签:
【中文标题】Node / express中的路由【英文标题】:routing in Node / express 【发布时间】:2018-01-10 03:08:57 【问题描述】:app.js:
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var index = require('./routes/index');
var newproject = require('./routes/newProject');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: false ));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/newproject', newproject);
// catch 404 and forward to error handler
app.use(function(req, res, next)
var err = new Error('Not Found');
err.status = 404;
next(err);
);
// error handler
app.use(function(err, req, res, next)
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : ;
// render the error page
res.status(err.status || 500);
res.render('error');
);
module.exports = app;
index.js
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next)
res.render('index');
);
module.exports = router;
新项目 .js
var express = require('express');
var router = express.Router();
var sql = require ('mssql');
router.get('/newproject', function(req, res)
res.render('newProject');
);
module.exports = router;
newProject.ejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
hello
</body>
</html>
和 view 中类似的 index.ejs 。
我的主目录有效,即 localhost:3000/
有效,但是当我输入
localhost:3000/newproject
出现以下错误:
错误:无法在视图目录“F:\project\pcgWebApp\views”中查找视图“错误” 在 EventEmitter.render (F:\project\pcgWebApp\node_modules\express\lib\application.js:580:17) 在 ServerResponse.render (F:\project\pcgWebApp\node_modules\express\lib\response.js:971:7) 在 F:\project\pcgWebApp\app.js:47:7 在 Layer.handle_error (F:\project\pcgWebApp\node_modules\express\lib\router\layer.js:71:5) 在 trim_prefix (F:\project\pcgWebApp\node_modules\express\lib\router\index.js:315:13) 在 F:\project\pcgWebApp\node_modules\express\lib\router\index.js:284:7 在 Function.process_params (F:\project\pcgWebApp\node_modules\express\lib\router\index.js:335:12) 在下一个 (F:\project\pcgWebApp\node_modules\express\lib\router\index.js:275:10) 在 F:\project\pcgWebApp\app.js:36:3 在 Layer.handle [as handle_request] (F:\project\pcgWebApp\node_modules\express\lib\router\layer.js:95:5)
任何人都知道发生了什么 - ?请帮助 - 尝试过 npm install 。
如果我放置它确实有效
router.get('/newproject', function(req, res)
res.render('newProject');
);
在 app.js 中,将路由器更改为 app.get..
【问题讨论】:
但我希望将它放在 newproject.js 中,因为我必须在 newProject.js 中查询一个数据库并将很多变量重新渲染到视图中 所以我在视图中创建了一个 error.ejs,但现在没有选择 /newprojects 路由,而是显示了 error.ejs 的内容。 如果我的解决方案有效,请选择它作为接受的答案 + 考虑给它一个赞成票 :) 【参考方案1】:我相信你的第一个错误是源于这段代码:
app.use(function(err, req, res, next)
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : ;
// render the error page
res.status(err.status || 500);
res.render('error');
);
更具体地说,是尝试渲染error
视图的部分。我会确保您的视图文件夹中有一个error.ejs
文件/视图。
我还将您的新 project.js 文件中的 /newproject
根更改为 /
,因为根来自文件名。
【讨论】:
谢谢 - 这很有效 - 我把 /newproject 改成了 / 太好了,我可以看到您还添加了一个 error.ejs 视图,该视图将修复您的初始错误。也可能值得将我的(或其他答案)标记为已接受。【参考方案2】:在newProject.js
中更改:
//...
router.get('/newproject', function(req, res)
res.render('newProject');
);
为此:
//...
router.get('/', function(req, res)
res.render('newProject');
);
由于 newProject.js 似乎被用作外部路由器,当您编写代码时,您的最终端点将是:
localhost:3000/newproject/newproject
相反,您希望它是:
localhost:3000/newproject/
这就是为什么你应该指定 '/' 作为路由内部的端点:因为 Express 中的路由路径是关联的
【讨论】:
以上是关于Node / express中的路由的主要内容,如果未能解决你的问题,请参考以下文章