📌  相关文章
📜  如何仅使用 express-validator 验证输入字段中的输入是否具有 BIC 或 Swift 代码?

📅  最后修改于: 2022-05-13 01:56:50.436000             🧑  作者: Mango

如何仅使用 express-validator 验证输入字段中的输入是否具有 BIC 或 Swift 代码?

在 HTML 表单中,我们经常需要验证不同的类型。验证现有电子邮件,验证密码长度,验证确认密码,验证仅允许整数输入,这些是验证的一些示例。使用银行系统时,在某个输入字段中只允许使用有效的银行识别码 (BIC)。 BIC 是一个 8 位或 11 位数字的字符串。它代表具有唯一位置的有效银行。我们还可以使用 express-validator 中间件验证这些输入字段以仅接受有效的 BIC。

成为有效 BIC 的条件:

  • 银行代码: 4 个字母代码,只允许使用大写字母。
  • 国家代码: 2 个字母代码,只允许使用大写字母。
  • 位置代码: 2 个字母代码,允许使用数字(0 到 9)或大写字母。
  • 分行代码: 3 字母可选代码,允许使用数字(0 到 9)或大写字母。

安装 express-validator 的命令:

npm install express-validator

使用 express-validator 实现逻辑的步骤:

  • 安装 express-validator 中间件。
  • 创建一个validator.js 文件来编码所有的验证逻辑。
  • 通过 validateInputField: check(input field name) 验证输入并在验证 isBIC() 上使用 ' 链接。 '
  • 使用路由中的验证名称(validateInputField)作为验证数组的中间件。
  • 从 express-validator 中解构 'validationResult'函数以使用它来查找任何错误。
  • 如果发生错误,则重定向到传递错误信息的同一页面。
  • 如果错误列表为空,则授予用户后续请求的访问权限。

注意:这里我们使用本地或自定义数据库来实现逻辑,可以按照相同的步骤在MongoDB或MySql等常规数据库中实现逻辑。

示例:此示例说明如何验证输入字段以仅接受有效的 BIC。

文件名 - index.js

const express = require('express')
const bodyParser = require('body-parser')
const {validationResult} = require('express-validator')
const repo = require('./repository')
const { validateBic } = require('./validator')
const formTemplet = require('./form')
const showTemplet = require('./show')
  
const app = express()
const port = process.env.PORT || 3000
  
// The body-parser middleware to parse form data
app.use(bodyParser.urlencoded({extended : true}))
  
// Get route to display HTML form
app.get('/', (req, res) => {
  res.send(formTemplet({}))
})
  
// Post route to handle form submission logic and 
app.post(
  '/account',
  [validateBic],
  async (req, res) => {
    const errors = validationResult(req)
    if(!errors.isEmpty()){
      return res.send(formTemplet({errors}))
    }
    const {aNumber, bic} = req.body
    const account = await repo.getOneBy({
      'accountNumber': aNumber,
      'bic': bic
    })
    if(account){
      console.log(account)
      res.send(showTemplet(account))
    }else{
      res.send('Account Not Found')
    }
})
  
// Server setup
app.listen(port, () => {
  console.log(`Server start on port ${port}`)
})

文件名——repository.js:该文件包含创建本地数据库并与之交互的所有逻辑。

// Importing node.js file system module 
const fs = require('fs')
  
class Repository {
  constructor(filename) {
      
    // The filename where datas are going to store
    if(!filename) {
      throw new Error('Filename is required to create a datastore!')
    }
  
    this.filename = filename
  
    try {
      fs.accessSync(this.filename)
    } catch(err) {
      // If file not exist it is created with empty array
      fs.writeFileSync(this.filename, '[]')
    }
  }
  
  // Get all existing records
  async getAll(){
    return JSON.parse(
      await fs.promises.readFile(this.filename, {
        encoding : 'utf8'
      })
    )
  }
  
  // Find record by property
  async getOneBy(filters){
    const records = await this.getAll()
    for(let record of records){
      let found = true
      for(let key in filters){
        if(record[key] !== filters[key]){
          found = false
        }
      }
      if(found) return record;
    }
  }
  
}
  
// The 'datastore.json' file created at runtime 
// and all the information provided via signup form
// store in this file in JSON format.
module.exports = new Repository('datastore.json')

文件名 - form.js:此文件包含显示表单以获取银行信息的逻辑。

const getError = (errors, prop) => {
  try {
    return errors.mapped()[prop].msg
  } catch (error) {
    return ''
  } 
}
  
module.exports = ({errors}) => {
  return `
    
    
      
        
        
      
      
        
          
            
              
                              
                  
                                       
                                   
                
                 
                                    
                                   

                   ${getError(errors, 'bic')}                  

                
                
                                   
              
            
          
        
                 ` }

文件名 - show.js:此文件包含显示获取的银行信息的逻辑。

module.exports = (account) => {
  return `
    
      
        Account Name :         ${account.accountName}       
      
        Account Number :         ${account.accountNumber}       
      
        Account Type :         ${account.accountType}       
      
        BIC :         ${account.bic}       
      
        Bank Name :         ${account.bankName}       
      
        Bank Location :         ${account.bankLocation}       
    
  ` }

文件名 - validator.js:此文件包含所有验证逻辑(验证输入字段以仅接受有效 BIC 的逻辑)。

const {check} = require('express-validator')
const repo = require('./repository')
module.exports = {
    
  validateBic : check('bic')
  
    // To delete leading and trialing space
    .trim()
  
    // Validate input field to accept only BIC
    .isBIC()
    .withMessage('Must be a valid Bank identification code')
}

文件名 - package.json

包.json 文件

数据库:

数据库

输出:

前两位数无效(仅允许使用字母)


第 3 和第 4 位无效(仅允许使用字母)


第 5 位和第 6 位无效(仅允许使用字母)


提交无效BIC时的响应(前三种情况)


有效的 BIC


提交有效 BIC 时的响应

注意:我们在 form.js 文件中使用了一些 Bulma 类(CSS 框架)来设计内容。