Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 ExpressJS:如何从全局中间件转储req.params_Javascript_Node.js_Middleware - Fatal编程技术网

Javascript ExpressJS:如何从全局中间件转储req.params

Javascript ExpressJS:如何从全局中间件转储req.params,javascript,node.js,middleware,Javascript,Node.js,Middleware,我无法为ExpressJS编写一个非常简单的中间件,将所有req.param记录到控制台。 似乎如果我将中间件添加到特定函数中,它就可以工作,而早期app.use中的相同代码在req.params中不会获得任何数据 下面是一个示例代码: const express = require('express') const app = express(); // Simply log the req.params to console const middle = ( req, res, next

我无法为ExpressJS编写一个非常简单的中间件,将所有req.param记录到控制台。 似乎如果我将中间件添加到特定函数中,它就可以工作,而早期app.use中的相同代码在req.params中不会获得任何数据

下面是一个示例代码:

const express = require('express')

const app = express();

// Simply log the req.params to console
const middle = ( req, res, next ) =>
{
    console.log ( "PARAMS: ", req.params );

    next ();
};

// Trying to access req.params in a global middleware does not work
app.use ( middle );

app.get('/', function (req, res) {
  res.send('hello, world!')
})

// Specifying middleware in mount point works
app.get ( "/hello/:world", middle, ( req, res ) =>
{
    console.log ( "This works: ", req.params );
    res.send ( 'hello' );
} );

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

它不能作为全局中间件工作,因为这个参数只存在于url/hello/:world中,而express在运行这个特定的url中间件之前不会知道这个参数

您可以使用process.nextTick来解决此问题

const middle = ( req, res, next ) => {
    process.nextTick(() => console.log ( "PARAMS: ", req.params ));

    next ();
};

根据所击中的端点,您可能不会得到任何东西,但它仍然应该是一个空对象。如果您点击/而不是/hello/:world,您将不会得到任何消息。这是可行的,但是nextTick是一个异步调用,可以在console.log之前执行next。这是一个简单的示例,顺序并不重要,但在一个更复杂的示例中,我应该在下一步之前需要数据,我认为这是不可能的。您不能使用express global middleware来完成这项工作,但如果需要,您可以包装您的函数