Node.js 中间件不能正常工作

Node.js middleware does not work properly

我有一个包含路由的模块。我想在让用户继续之前检查访问权限。在路由模块中,我有两个路由和两个访问检查功能,我想将它们用作中间件:

const doesUserExist = (req, res, next) => {
    if (!users[req.params.id]) {
        res.send(`Такого пользователя не существует`);
        return;
    }
    next();
}

const doesCatExist = (req, res, next) => {
    if (!cats[req.params.id]) {
        res.send(`Такой кошечки не существует`);
        return;
    }
    next();
}

dbAccess.get('/users/:id', (req, res) => {
    const { name, age } = users[req.params.id];
    res.send(`Пользователь ${name}, ${age} лет`);
});

dbAccess.get('/cats/:id', (req, res) => {
    const { nickName, color } = cats[req.params.id];
    res.send(`Кошечка ${nickName}, ${color} цвет`);
});

然后我将这些中间件导出到主文件中并按以下方式使用它们:

app.use('/users/:id', doesUserExist);
app.use('/', dbAccess);

app.use('/cats/:id', doesCatExist);
app.use('/', dbAccess);

对我来说没有任何原因,只有第一个中间件可以工作。如果我尝试输入不存在的 cat 的 id,我会得到一个错误 TypeError: Cannot destructure property 'nickName' of 'cats[req.params.id]' as it is undefined.,因此第二个中间件根本不工作并且没有访问检查发生。我创建了另一个 Routes 模块,其中包含另一个路由和中间件,并在主文件中也使用了它 works:

app.use('/users/:id', doesUserExist);
app.use('/', dbAccess);

app.use('/cats/:id', doesCatExist);
app.use('/', dbAccess);

app.use('/testpage', doesHaveAccess);
app.use('/testpage', testPage);

一个请求GET /cats/1

  • 忽略路由app.use('/users/:id', doesUserExist),因为路径不匹配
  • 采用路线 app.use('/', dbAccess),因为 / 匹配每条路径
  • 里面dbAccess
    • 忽略dbAccess.get('/users/:id', ...),因为路径不匹配
    • 需要dbAccess.get('/cats/:id', ...),因为路径匹配。这会导致您观察到的错误,因为 cats[req.params.id] === undefined.
  • 该请求从未到达路线 app.use('/cats/:id', doesCatExist)

你应该写

app.use('/users/:id', doesUserExist);
app.use('/cats/:id', doesCatExist);
app.use('/', dbAccess);