Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将参数从中间件传递到ExpressRouter_Javascript_Node.js_Express - Fatal编程技术网

Javascript 将参数从中间件传递到ExpressRouter

Javascript 将参数从中间件传递到ExpressRouter,javascript,node.js,express,Javascript,Node.js,Express,这个问题困扰了我很长时间,我从来没有找到一个答案可以清楚地向我解释这一点 我正在使用Express4.0,我制作了这个代码片段,向您展示我制作的解决方案,以获得我需要的结果 我想将参数req.method和一组routescontrollers.routes直接传递到express router,以定义方法并在中间件中过滤路由 var controller = require( './controllers' ); module.exports = function ( app ){

这个问题困扰了我很长时间,我从来没有找到一个答案可以清楚地向我解释这一点

我正在使用Express4.0,我制作了这个代码片段,向您展示我制作的解决方案,以获得我需要的结果

我想将参数
req.method
和一组routes
controllers.routes
直接传递到express router,以定义方法并在中间件中过滤路由

var controller = require( './controllers' );

module.exports = function ( app ){

    app.router.use(function ( req, res, next ){

        // function with the args before router get called
        anotherFn( app, req.method, controller );

        // Call the express router after called function with args
        next( 'route' );

    });

};

function anotherFn( app, method, controller ){

    // Express router called with args here...
    app.router[ method ]( controllers.routes,
        function ( req, res, next ){

            try{
                controller[ req.config.action ]( req, res, next );
            }catch( e ){
                next( 'error' );
            }

        }
    );

};
它目前正在工作,但在我看来,它似乎有点粗糙或粗略,因为我认为该函数从未得到解决,或者中间件在调用另一个函数后调用路由fn,奇怪的是,它是如何工作的,似乎不是一个好的实践

我担心将来这可能会给我带来异步问题,或者很难维护,因为代码似乎不可靠(或者至少对我来说)

现在我的问题是,这是否是一个好的做法,我可以保持现状,或者是否有另一种方法可以将这些参数传递给路由器,而这种方法看起来并不那么老套和奇怪。

tl;博士 您必须记住,在基于MVC的节点服务器上必须有两个阶段:配置阶段工作阶段;这是7个抽象处理层的构建基础:网络服务器(http/https/spddy/…)请求/响应中间件系统(express/connect)、路由器路由(express Router、Simple Router、emvici Router)、控制器模型(mongo cli/sequelize/…)和最后的视图(jade/ect/mustache/…)

在进入工作阶段之前,应该初始化和配置所有抽象层。如果您的服务器已经接收到请求,并且视图可能还没有工作,那么它们将产生错误。您正在路由器工作状态内配置路由器/路由


似乎有一些误解的概念在那里。每个请求都使用中间件执行。控制器(此处假设为MVC)用于保存每种数据的操作。通常,在MVC模式下,您总是有一个路由器/路由,一些框架在引擎盖下这样做,而其他框架则允许您这样做

Express和大多数最知名的nodejs模块都非常适合不完全遵循框架的概念,它们提供了围绕其目标的功能,但它们只提供基本的API内容,让您与其他模块粘合。这就是为什么你在谷歌上找到了针对同一个提议的各种教程,但实现方式完全不同

现在,回到你的疑问,控制器和路由器之间的绑定应该通过创建路由来完成。按照您的方式,每次有人请求时,您都会将路由添加到express中,这是一种内存密集型/糟糕的方法

我建议您在开始对抽象层进行编码之前,先从抽象层进行思考。假设您需要控制器、模型、视图、一个路由器、一个Http服务器(还没有应用程序)和一个应用程序(通常应用程序是中间件连接部分,可以是
connect
express
等等…)

  • server.js-在这里,您可以对您的服务进行抽象,这是选择是否为http/https/spdy等的地方
  • app.js-应用程序应该从服务器抓取所有请求,通过一组您需要的中间件传递它们,最后但并非最不重要的是,路由器作为中间件
  • router.js-当请求到达路由器时,它们应该已经包含了您需要的所有数据,现在是时候将它们重定向到路由了。为了实现这一点,路由器应该配置并准备好它们的路由。这里您需要
    路线
  • 路线/
    • index.js-在这里,您可以导出此文件夹中的所有路由,或者如果愿意,在这里配置它们。每条路线可能需要所需的控制器
  • 控制器/-您可能不需要索引,因为每个路由都需要每个控制器。在每个控制器上,您可能需要所需的模型和视图
  • 模型/-您可能不需要索引,因为每个需要模型的控制器都需要索引
  • 视图/-视图是控制器需要的,但在express case中,它们有一个视图引擎来实现这一点。查看他们的文档以了解更多详细信息
现在有一些更符合您的案例的代码:

server.js

var http = require( 'http' )
var server = http.createServer()
module.exports = server
var server = require( './server' )
var app = require( 'express' )()
module.exports = app

// Grab middlewares here...
// ...

// Now configuring router
app.use( require( './router' ) )

app.listen( server );
var router = new require( 'express' ).Router()
module.exports = router

// Load routes
require('./routes' ).forEach(function ( route ) {
  route( router )
})
exports.user_example = require( './user_example' )
var UserController = require( '../controller/user' )

module.exports = function ( router ) {
  router
    .route( '/user' )
    .post(UserController.create)
    .put(UserController.create)
  ;
  router
    .route( '/user/:id' )
    .get(UserController.view)
    .post(UserController.update)
    .put(UserController.update)
  ;
  router
    .route( '/user/delete/:id' )
    .get(UserController.delete)
  ;

}
// Here you should bind your modules

exports.create = function ( req, res, next ) {
  res.send( 200, 'created' )
}

exports.view = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.update = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.delete = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

app.js

var http = require( 'http' )
var server = http.createServer()
module.exports = server
var server = require( './server' )
var app = require( 'express' )()
module.exports = app

// Grab middlewares here...
// ...

// Now configuring router
app.use( require( './router' ) )

app.listen( server );
var router = new require( 'express' ).Router()
module.exports = router

// Load routes
require('./routes' ).forEach(function ( route ) {
  route( router )
})
exports.user_example = require( './user_example' )
var UserController = require( '../controller/user' )

module.exports = function ( router ) {
  router
    .route( '/user' )
    .post(UserController.create)
    .put(UserController.create)
  ;
  router
    .route( '/user/:id' )
    .get(UserController.view)
    .post(UserController.update)
    .put(UserController.update)
  ;
  router
    .route( '/user/delete/:id' )
    .get(UserController.delete)
  ;

}
// Here you should bind your modules

exports.create = function ( req, res, next ) {
  res.send( 200, 'created' )
}

exports.view = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.update = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.delete = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

router.js

var http = require( 'http' )
var server = http.createServer()
module.exports = server
var server = require( './server' )
var app = require( 'express' )()
module.exports = app

// Grab middlewares here...
// ...

// Now configuring router
app.use( require( './router' ) )

app.listen( server );
var router = new require( 'express' ).Router()
module.exports = router

// Load routes
require('./routes' ).forEach(function ( route ) {
  route( router )
})
exports.user_example = require( './user_example' )
var UserController = require( '../controller/user' )

module.exports = function ( router ) {
  router
    .route( '/user' )
    .post(UserController.create)
    .put(UserController.create)
  ;
  router
    .route( '/user/:id' )
    .get(UserController.view)
    .post(UserController.update)
    .put(UserController.update)
  ;
  router
    .route( '/user/delete/:id' )
    .get(UserController.delete)
  ;

}
// Here you should bind your modules

exports.create = function ( req, res, next ) {
  res.send( 200, 'created' )
}

exports.view = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.update = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.delete = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

routes/index.js

var http = require( 'http' )
var server = http.createServer()
module.exports = server
var server = require( './server' )
var app = require( 'express' )()
module.exports = app

// Grab middlewares here...
// ...

// Now configuring router
app.use( require( './router' ) )

app.listen( server );
var router = new require( 'express' ).Router()
module.exports = router

// Load routes
require('./routes' ).forEach(function ( route ) {
  route( router )
})
exports.user_example = require( './user_example' )
var UserController = require( '../controller/user' )

module.exports = function ( router ) {
  router
    .route( '/user' )
    .post(UserController.create)
    .put(UserController.create)
  ;
  router
    .route( '/user/:id' )
    .get(UserController.view)
    .post(UserController.update)
    .put(UserController.update)
  ;
  router
    .route( '/user/delete/:id' )
    .get(UserController.delete)
  ;

}
// Here you should bind your modules

exports.create = function ( req, res, next ) {
  res.send( 200, 'created' )
}

exports.view = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.update = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.delete = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

user\u example.js

var http = require( 'http' )
var server = http.createServer()
module.exports = server
var server = require( './server' )
var app = require( 'express' )()
module.exports = app

// Grab middlewares here...
// ...

// Now configuring router
app.use( require( './router' ) )

app.listen( server );
var router = new require( 'express' ).Router()
module.exports = router

// Load routes
require('./routes' ).forEach(function ( route ) {
  route( router )
})
exports.user_example = require( './user_example' )
var UserController = require( '../controller/user' )

module.exports = function ( router ) {
  router
    .route( '/user' )
    .post(UserController.create)
    .put(UserController.create)
  ;
  router
    .route( '/user/:id' )
    .get(UserController.view)
    .post(UserController.update)
    .put(UserController.update)
  ;
  router
    .route( '/user/delete/:id' )
    .get(UserController.delete)
  ;

}
// Here you should bind your modules

exports.create = function ( req, res, next ) {
  res.send( 200, 'created' )
}

exports.view = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.update = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.delete = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

controller/user.js

var http = require( 'http' )
var server = http.createServer()
module.exports = server
var server = require( './server' )
var app = require( 'express' )()
module.exports = app

// Grab middlewares here...
// ...

// Now configuring router
app.use( require( './router' ) )

app.listen( server );
var router = new require( 'express' ).Router()
module.exports = router

// Load routes
require('./routes' ).forEach(function ( route ) {
  route( router )
})
exports.user_example = require( './user_example' )
var UserController = require( '../controller/user' )

module.exports = function ( router ) {
  router
    .route( '/user' )
    .post(UserController.create)
    .put(UserController.create)
  ;
  router
    .route( '/user/:id' )
    .get(UserController.view)
    .post(UserController.update)
    .put(UserController.update)
  ;
  router
    .route( '/user/delete/:id' )
    .get(UserController.delete)
  ;

}
// Here you should bind your modules

exports.create = function ( req, res, next ) {
  res.send( 200, 'created' )
}

exports.view = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.update = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

exports.delete = function ( req, res, next ) {
  res.send( 200, req.param( 'id' ) )
}

希望有帮助!
何塞·莫雷拉(JoséMoreira)

请写下你的意图。你想要实现什么?查看您的代码,我发现您希望为控制器和控制器中的操作构建路由,对吗?我不理解你为什么在请求中注册新路线。请不要回答评论,而是编辑你的问题。谢谢你,伙计,非常感谢,非常好的解释!