使用快速验证器验证 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();
});
}
我希望用户能够在端点中写入特定的帐号,一直在尝试验证端点参数是否存在于我的数据库中。我无法让它工作,请问我做错了什么?
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)),
]
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();
});
}