繁体   English   中英

express.js中间件中的空params对象

[英]Empty params object in express.js middleware

const app = express();
var router = require('express').Router({mergeParams: true});
const payloadMiddleware = (req, resp, next) => {
  console.log('A:',req.params);
  const {params, query} = req;
  const payload = req.body;
  req.my_params = { params, query, payload };
  next();
};

router.use(payloadMiddleware);

router.get('/inventory/:itemID/price', async function GetPrice(req, res, next) {
  console.log('B', req.my_params);
  console.log('C', req.params);
}

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use('/', router);
server = app.listen(port);

GET /inventory/abc/price?a=1&b=2收益

A: {} # unclear why this is empty
B: { params: {},
     query: { a: '1', b: '2' },
     payload: {} } 
C: {itemID: 'abc'} 

所以我很困惑:我希望中间件在req找到params ,构造新对象,并将其分配给req作为my_params ,然后将其传递给清单处理程序。 这是部分发生的,原因是查询字符串已解析,然后在我的中间件中分配。 为什么在中间件函数中需要req.params === {} ,但是在GET处理程序本身中却需要req.params = {itemID: 'abc'}

没有其他具有相同模式的路由,没有其他中间件...

当我从第二行删除options对象时,也没有观察到任何变化,即var router = require('express').Router();

payloadMiddleware是一种通用中间件,未针对包含参数的任何特定URL模式声明它(它与任何请求匹配)。

Express还不知道传递给中间件的请求最终将最终到达/inventory/:itemID/price的处理程序中。

如果希望中间件接收参数,则必须专门将其用于匹配模式的路由:

app.use('/inventory/:itemID/price', payloadMiddleware);

或作为路由处理程序的一部分:

router.get('/inventory/:itemID/price', payloadMiddleware, async function ...);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM