如何使用 express 中间件处理所有路由?

Posted

技术标签:

【中文标题】如何使用 express 中间件处理所有路由?【英文标题】:How to use express middleware to handle all routes? 【发布时间】:2017-05-30 01:14:11 【问题描述】:

我在下面的代码中为用户设置路由时遇到问题,我想使用 express 中间件并尝试使用 app.use 的路由。

index.js 在调用 api 后调用用户控制器方法 所以在下面的代码中我试图从客户端发布数据 api/users 但它返回 404。

如何使用以下路线设置解决此问题?

server.js

var express        = require('express');
var app            = express();
var bodyParser     = require('body-parser');
var methodOverride = require('method-override');
var mongoose = require('mongoose');
console.log(mongoose.connection.readyState);
var db = require('./config/db');
var port = process.env.PORT || 8080; 
mongoose.connect(db.url); 
app.use(methodOverride('X-HTTP-Method-Override')); 
app.use(express.static(__dirname + '/public')); 

require('./app/routes')(app); // configure our routes
require('./config/express')(app); 
app.listen(port);                                  
console.log('listening on port ' + port);          
exports = module.exports = app;

app > routes.js

 module.exports = function(app) 


        app.use('api/users', require('./api/user'));
        app.get('*', function(req, res) 
            res.sendfile('./public/views/index.html'); // load our public/index.html file
           // res.sendFile(path.join(__dirname, ''../public/views/index.html'')); 
        );

    ;

配置> express.js

var express = require('express');
var morgan = require('morgan');
var bodyParser = require('body-parser');
// import cookieParser from 'cookie-parser';
// import errorHandler from 'errorhandler';
var path = require('path');
// import lusca from 'lusca';
var config = require('./db');
var mongoose = require('mongoose');
//var mongoStore = connectMongo(session);

module.exports = function(app) 
 // app.engine('html', require('ejs').renderFile);
  app.set('view engine', 'html');
  app.use(bodyParser.urlencoded( extended: false ));
  app.use(bodyParser.json());
  app.use(methodOverride());

我将为用户处理所有 crud 操作的用户索引

app > api > 用户 > index.js

var express = require('express');
var controller = require('./user.controller');

var router = express.Router();

router.get('/', controller.index);
router.post('/',controller.create);

module.exports = router;

【问题讨论】:

可能你应该指定/api/users,而不是api/users 尽量不要问重复的问题:***.com/questions/41644624 【参考方案1】:

第一:

处理所有请求

使用 app.use() 和 app.METHOD() 函数将应用程序级中间件绑定到 app 对象 的实例,其中 METHOD是中间件函数处理(如GET、PUT或POST)的请求的HTTP方法,小写

这个例子展示了一个没有挂载路径的中间件函数。每次应用收到请求时都会执行该函数。

app.use(function(req,res)
   

        res.sendfile('./public/views/index.html');
       console.log("Not found....I will handle *unhandle* rout here for you");
)

//app.get('*', function(req, res)用上面的函数代替这个

但这个函数在最后,所以它只会在没有找到应用程序对象的路由路径时执行。 Express documentation

第二次:

处理createuser

var express = require('express');
var controller = require('./user.controller');

var router = express.Router();
// you must define route which you want to handle in user file
router.get('/api/user', controller.index);

router.post('/',controller.create);

module.exports = router;

用一些解释更新工作示例

您的 app.js 文件

var express=require('express')
var app=express()
app.use('api/user',require('./user'))
app.use('/',require('./user'))
app.use(function(req,res)
       
    res.sendfile('stack10.html')
    console.log("Not found....I will handle *unhandle* rout here for you");
)
app.listen(8080,function()

          
    console.log("server listening on port 8080")
)

user.js

var express = require('express')
var router = express.Router()
var app=express()
router.get('/api/user', function(req, res) 
  res.send('respond for ..../api/user')
);
router.get('/',function (req,res) 
   res.send('respose for ..../')
)
module.exports = router;

您的 app.use 将是 app.use(api/user) 而在用户中将是 router.get(/api/user) 所以当你尝试 http://127.0.0.1:8080/api/user 您的回复将是respond for ..../api/user

【讨论】:

我无法理解您在回答中实现了什么,这让我感到困惑,因为您提到的文件名不同。 第二个只是为了您的理解复制粘贴它并在您的环境中运行以获得更多理解 所以你说第一个是根据我的代码的答案? 而且你可以根据你的代码自己尝试一下。 是的,如果您仍然感到困惑,请将您的项目标记在 GitHub 上或在此处发布链接,如果您在两天后仍然卡住,我将在您的项目中进行更改

以上是关于如何使用 express 中间件处理所有路由?的主要内容,如果未能解决你的问题,请参考以下文章

三Express 路由

Node/Express 的 Passport 身份验证中间件 - 如何保护所有路由

Node.js + Express 接口请求(GETPOSTPUT)事例

如何使 Express 路由默认需要身份验证?

路由 + Express 路由

路由 + Express 路由