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 xxx
はmodule.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-cliのsequelize 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;
ここを参照。