NodeJS+ES 7+Express+MySQLはAPI serverのベストドライバーを構築します。

2567 ワード

以前はjavascriptの多くの不完全なデザインのため、私は振り向いてiced-coffee scriptに頼っていました。正直に言って、私が使っていたのはとても楽しかったです。ES 5年代に、みんなの前でマルチコード農がcalback hallでもがいていた時に、iced-coffeescriptのasync/awaitを使って、calback hellとES 6のPromise.all機能を簡単に解決しました。
しかし、時代の発展とともに、javascript言語自体もES 7に進化しました。coffeescriptから生まれた太い矢印とasyncも標準に書かれました。それに、いくつかの啓発を受けました。JSを再び抱擁し、よく整理してください。
まず、asyncを使うなら、NodeJSは7.0以上にアップグレードしなければなりません。過程は全然怖くないです。公式サイトにインストールファイルをダウンロードして、次のステップ、次のステップで完成します。
また、ORMは使わないつもりです。ちょっと複雑なqueryでさえあれば、SQLはORMに完勝します。
node-mysqlをasync/awaitに変更します。
元々node-mysqlの最適な実践は連続池を作ることです。connectionのライフサイクルをpoolに任せて管理/回収します。標準的な使い方は以下の通りです。

pool.query('SELECT * FROM User WHERE id=?',[1],(err,result) => {
    if(err) return errorHandler(res,err);
    ...
});

asyncはpromiseの上に構築されているので、node-mysqlオフィシャルはpromiseの実作を提供していないようです。
// db.js
const db = {
    query (query,params) {
        return new Promise(resolve, reject) {
            pool.query(query,params,(err, result) => {
                if(err) reject(err);
                else resolve(result);
            });
        }
    }
}
export default db;
promise会throw exceptionだけに、使う時もtry catchで包んでください。
router.get('/user/:id', async (req,res) => {
    try {
        const user = await db.query('SELECT * FROM User WHERE id=?',[req.params.id])
        const notebook = await db.query('...', otherParams)
    }
    catch (e) {
        return errorHandler(res,err)
    }
});
毎回try catchが必要だと思うならば、ここに解決案A、解決案B、解決案Cがあります。注意するのは、複数のqueryがある時は、poolを使うほうがいいです。
requireはimportに進化しました。
残念ながら、NodeJS 7.0はまだimportを支援しないので、babelで翻訳しなければなりません。しかも、全体のアプリが起動する時はまずtry-catchを使ってください。一番いい実践は以下の通りです。
  • package.jsonを修正し、require('babel-register')
  • を実行する。
    "scripts": {
        //   node-dev
        "dev": "node-dev --use_strict ./bin/index"
      },
    "devDependencies": {
        "MD5": "~1.2.0",
        "babel-cli": "^6.24.1",
        "babel-preset-es2015-node4": "^2.1.0",
        "babel-preset-stage-3": "^6.5.0",
        "babel-register": "^6.6.5",
        ...
    }
    
  • 新規追加。babelrc
  • {
          "presets": ["es2015-node4", "stage-3"]
    }
    
  • 新規追加./bin/index.js
  • require('babel-register');
    require('../app.js');
    
  • npm install
  • routerを整理する
    次号に続く