使用快速验证器验证 req.params

Validating req.params with express validator

我希望用户能够在端点中写入特定的帐号,一直在尝试验证端点参数是否存在于我的数据库中。我无法让它工作,请问我做错了什么?

My validation

const validateReq: [
param('accountNumber').exists().custom(acctNo => accountNumberExist(acctNo)),]

My accountNumberExist function

    accountNumberExist(inputAcct) {
    const isfound = accounts.find(account => account.accountNumber === inputAcct);
    if (isfound === undefined) throw new Error('Account Number not found');
  }

My accounts file

    const accounts = [
  {
    id: 1,
    accountNumber: 1234567890,
    createdOn: new Date(),
    owner: 1,
    type: 'current',
    balance: 23444.43,
    status: 'active',
  },
  {
    id: 2,
    accountNumber: 1234167890,
    createdOn: new Date(),
    owner: 1,
    type: 'savings',
    balance: 2233444.43,
    status: 'active',
  },
  {
    id: 3,
    accountNumber: 9987654321,
    createdOn: new Date(),
    owner: 2,
    type: 'saving',
    balance: 73444.43,
    status: 'active',
  },
];

但是这总是抛出 'Account Number not found' 错误,尽管 req.param 存在于我的帐户数据库中。

Params 被 express 中间件解析为 string。假设我对下面定义的路径发出请求,例如 /some/1000

app.get('/some/:path', (req, res, next) => {
  console.log(typeof req.param.path)
  // outputs string
})

因此您需要将传入参数解析为整数(数字),因为您已将 accountNumber 存储为整数。所以像下面这样将 toInt 添加到链中应该可以解决它:

const validateReq: [
  param('accountNumber').exists().toInt().custom(acctNo => accountNumberExist(acctNo)),
]
accounts 数组中的

accountNumber 是一个数字,而 req.params.accountNumber 是一个字符串。您需要转换数据类型。你可以这样做

    accountNumberExist(inputAcct) {
        const isfound = accounts.find(account => account.accountNumber.toString() === inputAcct);
        if (isfound === undefined) throw new Error('Account Number not found');
  }

我认为问题出在您的查询上。 find 方法以异步方式运行,这就是为什么 isfound 属性 不包含您期望的数据。这是一个使用 promises 的简单方法,对我来说效果很好。

// Here is your function.
accountNumberExist(inputAcct) {
    return accounts.find({accountNumber: inputAcct})
    .then(result => {
        if (result.length == 0) {
            console.log("Account Number not found");
            return Promise.reject('Account Number not found');
        }
        return Promise.resolve();
    });

}