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