Проверка правильности req.params с помощью экспресс-валидатора - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу, чтобы пользователь мог написать конкретный номер учетной записи в конечной точке, пытаясь проверить параметр конечной точки, если он существует в моей базе данных. Я не мог заставить его работать, пожалуйста, что я делаю не так?

Моя проверка

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

Моя учетная записьNumberExist функция

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

Файл моих аккаунтов

    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',
  },
];

Но это всегда приводит к ошибке «Номер счета не найден», хотя req.param существует в моей базе данных учетных записей.

Ответы [ 3 ]

2 голосов
/ 11 апреля 2019

Параметры анализируются промежуточным программным обеспечением как string.Скажем, я делаю запрос к указанному ниже пути, например /some/1000

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

Так что вам нужно проанализировать входящий параметр в integet, поскольку вы сохранили accountNumber как целое число.Поэтому добавление toInt в цепочку, как показано ниже, должно решить эту проблему:

const validateReq: [
  param('accountNumber').exists().toInt().custom(acctNo => accountNumberExist(acctNo)),
]
1 голос
/ 11 апреля 2019

accountNumber внутри массива account - это число, тогда как req.params.accountNumber - это строка.Вам необходимо преобразовать тип данных.Вы можете сделать это как

    accountNumberExist(inputAcct) {
        const isfound = accounts.find(account => account.accountNumber.toString() === inputAcct);
        if (isfound === undefined) throw new Error('Account Number not found');
  }
0 голосов
/ 11 апреля 2019

Я думаю, что проблема в вашем запросе.Метод 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();
    });

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...