FullStackOpen Part3-d Validation and ESLint メモ

Validation

noteのcontentが入っていない場合のような例外をルートハンドラー(app.post('/api/notes')みたいなの)中で処理していたが、よりよい方法としてMongooseが持つValidation機能がある

const noteSchema = new mongoose.Schema({
  content: {
    type: String,
    minLength: 5,
    required: true
  },
  important: Boolean
})

ビルトインのもの以外にもカスタムで検証を作ることもできる
参考

const userSchema = new Schema({
  phone: {
    type: String,
    validate: {
      validator: function(v) {
        return /\d{3}-\d{3}-\d{4}/.test(v);
      },
      message: props => `${props.value} is not a valid phone number!`
    },
    required: [true, 'User phone number required']
  }
});

const User = db.model('user', userSchema);
const user = new User();
let error;

user.phone = '555.0123';
error = user.validateSync();
assert.equal(error.errors['phone'].message,
  '555.0123 is not a valid phone number!');

user.phone = '';
error = user.validateSync();
assert.equal(error.errors['phone'].message,
  'User phone number required');

user.phone = '201-555-0123';
// Validation succeeds! Phone number is defined
// and fits `DDD-DDD-DDDD`
error = user.validateSync();
assert.equal(error, null);

エラー処理としてcatch(error => next(error))をする

エラーハンドラー側はerror.name==="ValidationError"でキャッチする

PUTの時も同じようにValidationする

app.put('/api/notes/:id', (request, response, next) => {
  const { content, important } = request.body

  Note.findByIdAndUpdate(
    request.params.id, 
    { content, important },
    { new: true, runValidators: true, context: 'query' }
  ) 
    .then(updatedNote => {
      response.json(updatedNote)
    })
    .catch(error => next(error))
})

Deploying the database backend to production

fly secrets set SOMESECRET="SECRETHERE" でセットする

Lint

Lintとはスタイル上のエラーを含むプログラミング言語のエラーを検出してフラグを立てるツールのこと。
JavascriptではESlintがよく使用される

npm install eslint --save-dev
npx eslint --init

.eslintrc.jsファイルは以下のような感じで設定
rulesに主に追加する
.eslintignoreファイルを作成し、buildフォルダを無視することができる

module.exports = {
    'env': {
        'commonjs': true,
        'es2021': true,
        'node': true
    },
    'extends': 'eslint:recommended',
    'parserOptions': {
        'ecmaVersion': 'latest'
    },
    'rules': {
        'indent': [
            'error',
            4
        ],
        'linebreak-style': [
            'error',
            'unix'
        ],
        'quotes': [
            'error',
            'single'
        ],
        'semi': [
            'error',
            'never'
        ]
    }
}


いいなと思ったら応援しよう!