express.Router()与app.get [英] express.Router() vs. app.get

查看:174
本文介绍了express.Router()与app.get的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Express 4服务器进行Node.js



有一个路由器烧录到Express中,如下所示:


在app.js中




  var router = express 。路由器(); 
app.use(router);
app.use('/ users',usersRoutes);




在userRoutes.js中:




  var router = express.Router(); 

router.get('/',function(req,res,next){

}

router.get('/:user_id ',function(req,res,next){

}

router.post('/:user_id',function(req,res,next){

}

router.put('/:user_id',function(req,res,next){

}

router.delete('/:user_id',function(req,res,next){

}

module.exports = router;

但是我发现很难找到这种类型的路由器在线的固体文档。使用app.get,app.post,app.put,app.delete等。更令人困惑的是第一个参数(路由路径)似乎要求我们作为程序员将app.use参数从router.get / post / put / delete方法。



例如:

  app.use('/ users',usersRoutes); 

...这个mea ns,所有路径在usersRoutes中已经有一个不可见的'/ users'在路径的开头 - 我不知道我还不喜欢。
这意味着在usersRoutes.js中:

  var router = express.Router(); 

router.get('/ users /:user_id',function(req,res,next){// WRONG !!

}

router.get('/:user_id',function(req,res,next){// RIGHT

}

这有点令人困惑,但也许我可以通过更长的路径欣赏。



鉴于此表达式缺乏文档.Router - 我认为这不是首选方式 - 但是是否可以使用express.Router创建一个可靠的RESTful后端,并且它是否附有所有基本的HTTP动词?



另一个令人困惑的事情是---->在app.js中我们有一个路由器的实例 app.use(express.Router()) - 怎么这个路由器实例与其他实例进行交互?对它的表情没有什么意义。

解决方案

正如Bidhan A的答案所说,这是喜欢的方式来做Express,看起来就像Express 4。



你可以完全调整您的代码和逻辑。



例如,您可以使用以下代码: routes / APIRouter.js / p>

  var apiRouter = express.Router(); 

apiRouter.get('/ reports',controllers.getReports);
apiRouter.get('/ reports /:id',controllers.getReport);
apiRouter.post('/ reports',controllers.createReport);
apiRouter.put('/ reports /:id',controllers.updateReport);
apiRouter.delete('/ reports /:id',controllers.deleteReport);

此外,您可以拥有 /controllers/reportsController.js 最后在你的主文件 app.js 或者也称为 server.js get:

  var express = require('express'); 
var app = new express();
var apiRouter = require('./ routes / APIRouter');
app.use('/ api',apiRouter);

所以,回答你的问题:



<
  • 是的,这是首选,不知何故官方的方式。

  • 是的,你有整个HTTP通过使用 Router body-parser error-handler cookie-parser 以便完成该控件

  • 注意:这假设您已经知道一个首选的一般Web框架目录结构,并执行模块导出。


    I am using Express 4 server for Node.js

    There is a router baked into Express like so:

    in app.js

        var router = express.Router();
        app.use(router);
        app.use('/users', usersRoutes);
    

    in userRoutes.js:

    var router = express.Router();
    
    router.get('/', function (req, res, next) {
    
    }
    
    router.get('/:user_id', function (req, res, next) {
    
    }
    
    router.post('/:user_id', function (req, res, next) {
    
    }
    
    router.put('/:user_id', function (req, res, next) {
    
    }
    
    router.delete('/:user_id', function (req, res, next) {
    
    }
    
    module.exports = router;
    

    but I am finding it very difficult to find any solid documentation for this type of router online. There is a lot more documentation for the old style of using app.get, app.post, app.put, app.delete, etc. One of the more confusing things is that the first argument (the route path) seems to require that we as programmers strip the app.use argument from the router.get/post/put/delete methods.

    For example:

    app.use('/users', usersRoutes);
    

    ...this means that all the routes in usersRoutes already have an invisible '/users' at the beginning of the paths - something I am not sure I like yet. This means in usersRoutes.js:

     var router = express.Router();
    
     router.get('/users/:user_id', function (req, res, next) {  //WRONG!!
    
        }
    
     router.get('/:user_id', function (req, res, next) {  //RIGHT
    
        }
    

    This is a bit confusing, but perhaps something I could appreciate with longer paths.

    Given the lack of documentation for this express.Router - I assume this is not the preferred way - but is it possible to create a solid RESTful backend with express.Router - and does it have all the basic HTTP verbs attached to it?

    Another confusing thing is ----> in app.js we have an instance of router app.use(express.Router()) - how does this router instance interact with the others? Makes little sense on the face of it.

    解决方案

    As Bidhan A's answer states, this is preferred way to do it with Express and looks like that since Express 4.

    You can completly modulate your code and logic.

    For example you can have a routes/APIRouter.js file with this code:

    var apiRouter = express.Router();
    
    apiRouter.get('/reports', controllers.getReports);
    apiRouter.get('/reports/:id', controllers.getReport);
    apiRouter.post('/reports', controllers.createReport);
    apiRouter.put('/reports/:id', controllers.updateReport);
    apiRouter.delete('/reports/:id', controllers.deleteReport);
    

    Also you could have /controllers/reportsController.js and finally at your main file app.js or also named server.js get:

    var express = require('express');
    var app = new express();
    var apiRouter = require('./routes/APIRouter');
    app.use('/api',apiRouter);
    

    So, answering your question:

    1. Yes this is preferred and somehow official way to do it.
    2. Yes, you got whole HTTP to control by using Router and you should use another express based modules like: body-parser, error-handler or cookie-parser in order to complete that control.

    Note: this assumes you already know a preferred general web framework directory structure and do module exports.

    这篇关于express.Router()与app.get的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆