Node.jsのあれこれ

今のプロジェクトで、Node.jsを使ったAPIサーバの開発を行っていて、その時のいろいろをメモ。

Node 5.0.0への対応

プロジェクトではv0.12.7で開発を進めているけど、自分で使っているBoilerplateはv5.0.0に対応を。
node_modulesのディレクトリ構成が変更になっていて、従来までnpmが依存するパッケージはそのnpmのnode_modulesに配置されていたのが、全てnode_modules直下に配置されるように。
アプリケーションでの利用はほとんど影響はないと思うけど、利用しているnpmの依存パッケージを直接利用している場合は注意が必要。
gulpタスクでBabelのRequire Hookを利用するのに、gulp-babel内部のbabel-coreを呼び出している部分はパスの修正を実施。

Bable 6.0への対応

Babel 6.0からトランスパイルの部分がモジュール化され、別途インストールする必要が。
Babel 5と同様の変換を行うプリセットが提示されていたので、ひとまず"es2015", "react", "stage-2"をpresetsに指定。
また、Require Hookで利用する際にもpresetsなどを指定する必要があり。
インポート時に指定でできるけど、gulp-babel等で同じことを複数箇所に書くのは嫌なので、.babelrcに設定をまとめて記述。
package.jsonと同じディレクトリに配置しておくと、gulp-bableやbabelify、Require Hookなどでの実行時に、それを見に行ってくれる。

以下を参考に。
6.0.0 Released
FAQ
babel6での変更点 Gulp・Webpackの設定

export defaultの挙動

ECMAScript 2015の仕様として、export default xxxmodule.exports.default = xxxとなる。
Babelによって変換されたコードは当然このように変換されるので、CommonJSのvar xxx = require('./xxx')でインポートするとxxx = { default: xxx }となる。
require('./xxx').defaultとするか、エクスポートする側でmodule.exports = xxxとするか。
もしくはES2015 modules to CommonJS transformプラグインに追加。
Nodeyardではexpress-generatorで出力された/bin/wwwがインポートする対象の、app.jsだけCommonJS形式のエクスポートとしている。
全部変換の対象にすればいいのだろうけど。

Sequelizeで既存のテーブルにアクセス

sequelize-clisequelize initでModelへのエントリーポイントとなる/models/index.jsを生成。
あとは手動なりコマンドなりで、/modelsディレクトリに、index.jsが読み込める形式でModelの定義していく。

テーブル定義がスネークケースとなっているのをキャメルケースとして扱いたいこと、timestampが不要なことから、以下を記述。

{
  timestamps: false,
  underscored: true,
  freezeTableName: true,
  tableName: 'table_name',
  associate: (models) => {}
}

idはPostgreSQLのシーケンスを使っているので、idの定義を以下のように。

id: {
  type: DataTypes.INTEGER,
  primaryKey: true,
  autoIncrement: true
}

詳しくはWorking with legacy tablesを。

PostgreSQLでユーザ定義型の確認

以下のSQLで確認できる。

SELECT t.typname, e.enumlabel 
  FROM pg_type t, pg_enum e 
  WHERE t.oid = e.enumtypid;

ここを参照。