NullをReturnするのが適切な場合について調べた

どんな場合のときだとNullを返したほうがいいか、深く考えたことがないなと思ったのでいろいろ調べてみた。 Is it better to return NULL or empty values from functions/methods where the return value is not present?にとても有意義な情報がちりばめられていた。その中でも一番上の回答をしているJW8さんが下の内容を投稿していてとても参考になった。

Returning null is usually the best idea if you intend to indicate that no data is available. An empty object implies data has been returned, whereas returning null clearly indicates that nothing has been returned. Additionally, returning a null will result in a null exception if you attempt to access members in the object, which can be useful for highlighting buggy code – attempting to access a member of nothing makes no sense. Accessing members of an empty object will not fail meaning bugs can go undiscovered

要約

データを取得しようとして、データが存在しない場合にnullを返すのは意味があるので適切だけど、存在しないはずのプロパティにアクセスしようとしたりして予期しないエラーのときにnullを返すのはバグを隠蔽しているために不適切。
と書かれてあってとてもしっくりきた。

【Node.js】cryptoを使って暗号化をする

ユーザーのメールアドレスやパスワードをDBに格納する場合はセキュリティ上の観点から、暗号化させる必要があったのでメモ。

メールアドレスは復元が可能な可逆方式、パスワードは復元が不可能な不可逆方式で暗号化させる必要があるかと思います。

以下はメールアドレスは aes-256-ctr で、パスワードは hash 方式で暗号化させるサンプルコードになります。

メールアドレス

const crypto = require('crypto');
const key = ‘abc’;
// 暗号化
const encrypt = (text) => {
    let cipher = crypto.createCipher(‘aes-256-ctr’ ,key)
    let crypted = cipher.update(text,'utf8','hex')
    crypted += cipher.final('hex');
    return crypted;
}

// 復元
const decrypt = (text) => {
    let decipher = crypto.createDecipher(‘aes-256-ctr’,key);
    let dec = decipher.update(text,'hex','utf8')
    dec += decipher.final('utf8');
    return dec;
};

// 例
const val = encrypt('apple');
// e15690645d
decrypt(val);
// apple

パスワード

// 暗号化
const hashed = (password) => {
   let hash = crypto.createHmac('sha512', password)
   hash.update(password)
   let value = hash.digest('hex')
   return value;
}

// 例
hashed(‘apple’)
e8244ca53f71dc5be93bc074286828f466eca7cdd46ef47438d83d02f250be9a53825d133c5ef5cd99dadb5b957f39d2f9bbd0dbc20eec350768bcdda56a73bb

使っていないDockerのimageを削除するワンライナー

以下のコマンドで使用していないDockerのimageを削除できます。

    $ docker rmi $(docker images | grep "^" | awk "{print $3}")

ビルドしていたらいつのまにかDockerのimageが作成されまくるので定期的にクリーンアップする必要があるので便利。

JavaScriptの例外処理を上手に書く

Errorを継承したCustomErrorクラスを使ったらきれいに書けた。

custom_error.js

class CustomError extends Error {
  constructor ( message = 'エラーが発生しました') {
    super();
    this.name = 'CustomError';
    this.message = message;
  }
}
module.exports = CustomError;

未成年がアクセスしてはいけない機能を実装する場合は下のような感じになります。


const CustomError = require('./custom_error.js');

const validateAge = (age) => {
    if (age < 20) {
         new CustomError('未成年はアクセスしてはいけません');
    }
}


try {
    validateAge(age)
    ...任意の処理...
} catch (err) {
    if (err.name === 'CustomError'){
        alert(err.message);
    }else{
        alert('予期しないエラーが発生しました');
    }
}


サーバー側でもクライアント側でも使えて便利。