在app.param()中处理多个参数

问题描述 投票:0回答:1

我正在 Express.js 中开发一个 API,并尝试实现一个

app.param()
函数来处理 GET 请求中的 id 参数:

app.param('id', (req, res, next, id) => {
    const envelopeIndex = Number(id);
    const envelopeId = envelopes.findIndex(envelope => envelope.id === envelopeIndex);
    if (envelopeId === -1) {
        res.status(400).send("Error: No envelope found with this ID");
    }
    req.id = envelopeId;
    next();
});

对于另一个将一定金额从一个信封转移到另一个信封(通过其 ID)的 POST 请求处理程序,我还想验证两个都是 ID 的路由参数 (/envelopes/:from/:to/)。

我的问题:

  1. 我可以重构上面的中间件,让它处理多个参数,而不必重复自己吗?
  2. 如果是这样,有没有一种方法可以动态地将经过验证的 ID 分配给请求对象(例如,如果我正在验证“from”的 ID,它会为 req.senderId 分配经过验证的 ID,等等)

我尝试过:

  • 重复中间件三次(每个路由参数一次)
javascript node.js express rest middleware
1个回答
1
投票

req.id = envelopeId;
小心用自定义字段污染
req
对象,它可能会影响其他中间件,无论如何,参数已经在
req
对象上,
req.params.id

通过避免上述情况,它也会让你的问题更容易处理。

您可以创建 2 个指向同一函数的命名参数。

例如。

const handleId = (req, res, next, id) => {
    const envelopeIndex = Number(id);
    const envelopeId = envelopes.findIndex(envelope => envelope.id === envelopeIndex);
    if (envelopeId === -1) {
        res.status(400).send("Error: No envelope found with this ID");
    }
    next();
}); 

app.param('id', handleId);
app.param('id_to', handleId);

您的 POST 路线可能只是 ->

app.post('/envelopes/:id/:id_to/', (req, res) => {
  console.log(req.params.id);
  console.log(req.params.id_to);
  res.end('ok');
})
© www.soinside.com 2019 - 2024. All rights reserved.