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中的路由的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 函数不适用于 node.js 中的 express.js 路由

使用 express 的 Node.js 中的静态路由问题

浅析Express中的路由与应用模式

node使用express路由router

node服务端开发中express路由和http路由总结

对比原生Node封装的Express路由 和 express框架路由