我正在处理Express.js中的一个API,并try 实现一个处理GET请求中的id参数的app.param()函数:

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();
});

对于另一个从一个信封向另一个信封传输一定数量的POST请求处理程序(通过它们的ID),我还想验证两个都是ID的路由参数(/envelopes/:from/:to/).

我的问题:

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

我试过:

  • 重复中间件三次(每个路由参数一次)

推荐答案

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);

你的邮寄路由可能就是->;

app.post('/envelopes/:id/:id_to/', (req, res) => {
  console.log(req.params.id);
  console.log(req.params.id_to);
  res.end('ok');
})

Javascript相关问答推荐

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

Angular:动画不启动

我们如何从一个行动中分派行动

使用GraphQL查询Uniswap的ETH价格

加载背景图像时同步旋转不显示的问题

Html文件和客户端存储的相关问题,有没有可能?

Chart.js-显示值应该在其中的引用区域

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

未加载css colored颜色 ,无法将div设置为可见和不可见

在css中放置所需 colored颜色 以填充图像的透明区域

Reaction Redux&Quot;在派单错误中检测到状态Mutations

自定义确认组件未在vue.js的v菜单内打开

按下单键和多值

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

用另一个带有类名的div包装元素

AG-GRIDreact 显示布尔值而不是复选框

如何创建一个for循环,用于计算仪器刻度长度并将其放入一个HTML表中?

如何将值从后端传递到前端

鼠标进入,每秒将图像大小减小5%