Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

readme translate japanese split

  • Loading branch information...
commit ec01f4b95819325cbdcfcd8b839becbc16e61380 2 parents c25566b + 758dd67
@invalid-email-address invalid-email-address authored
View
2  bin/katana
@@ -9,7 +9,7 @@ var spawn = require('child_process').spawn;
var App = require('commander');
App.version(require(mod_root + 'package').version);
-App.usage('<command> [options]');
+App.usage('katana <command> [options]');
App.on('--help', function() {
console.log(' Commands:'+ eol);
View
10 bin/modules
@@ -323,7 +323,7 @@ App.command('install <name> [url]')
}
Fs.writeFile(root +'package.json', JSON.stringify(pack, null, 2), function(error) {
- console.log('\nModule "'+ name +'" now installed! Run "katana modules-enabled '+ name +'" to enable it.');
+ console.log('\nModule "'+ name +'" now installed! Run "katana module enable '+ name +'" to enable it.');
process.exit();
});
@@ -395,7 +395,13 @@ App.command('uninstall <name>')
run_hook('uninstall', module, function(error) {
if (error) { return Err(error); }
- remove(root +'modules/'+ module, function(error) {
+ var path = root +'modules/'+ module;
+
+ if (Fs.existsSync(path +'.js')) {
+ path += '.js';
+ }
+
+ remove(path, function(error) {
if (error) { return Err(error); }
var pack = require(root +'package.json');
View
4 lib/bootstrap.js
@@ -1,11 +1,11 @@
var EventEmitter = require('events').EventEmitter;
var Async = require('async');
-EventEmitter.prototype.parallel = function(event, callback) {
+EventEmitter.prototype.emitParallel = EventEmitter.prototype.parallel = function(event, callback) {
emit.call(this, event, callback, Array.prototype.slice.call(arguments, 2), 'parallel');
}
-EventEmitter.prototype.series = function(event, callback) {
+EventEmitter.prototype.emitSeries = EventEmitter.prototype.series = function(event, callback) {
emit.call(this, event, callback, Array.prototype.slice.call(arguments, 2), 'series');
}
View
170 lib/cookie.js
@@ -1,121 +1,101 @@
-var Log = App.Log;
-
var sanitize = require('./utils').sanitize;
-var config = App.Config().cookie;
+var cookies = {};
-Class('Katana.Core.Cookie', {
- have: {
- data: {}
- },
-
- methods: {
- parse: function(Request) {
- var Cookies = this;
-
- if (Request.request.headers['cookie']) {
- var c = Request.request.headers['cookie'].split(';');
+cookies.CookieCollection = function (req) {
+ this.collection = {};
+ if (req.headers['cookie']) {
+ this.parse(req.headers['cookie'] || {});
+ }
+};
- var item, parsed, name, value;
+cookies.CookieCollection.prototype = new function () {
+ this.parse = function (header) {
+ var c = header.split(';');
+ var item;
+ var parsed, name, value;
+ for (var i = 0; i < c.length; i++) {
+ item = sanitize(c[i]).trim();
+ parsed = item.split('=');
+ name = parsed[0];
+ value = parsed[1];
+ this.collection[name] = new cookies.Cookie(name, value);
+ }
+ };
- for (var i=0; i<c.length; i++) {
- item = sanitize(c[i]).trim();
+ this.toArray = function () {
+ var send = [];
+ var c;
+ for (var p in this.collection) {
+ c = this.collection[p];
+ if (c.send) {
+ send.push(c.toString());
+ }
+ }
+ return send;
+ };
- parsed = item.split('=');
+ this.get = function (name) {
+ var c = this.collection[name] || {};
+ return c.value;
+ };
- name = parsed[0];
- value = parsed[1];
+ this.set = function (name, value, opts) {
+ var c = new cookies.Cookie(name, value, opts);
+ c.send = true;
+ this.collection[name] = c;
+ };
- Cookies.data[name] = new Cookie(name, value, config);
- }
- }
- },
-
- to_array: function() {
- var send = [];
-
- for (var cookie in this.data) {
- var c = this.data[cookie];
-
- if (c.send) {
- send.push(c.toString());
- }
- }
-
- return send;
- },
-
- get: function(name, def_value) {
- if (!name) { return this.data; }
-
- var cookie = this.data[name] !== undefined ? this.data[name].value : def_value;
-
- return cookie;
- },
-
- set: function(name, value, options) {
- this.data[name] = new Cookie(name, value, options);
- },
-
- delete: function(name) {
- this.set(name, null, { lifetime: 0 });
- }
- }
-});
+ this.delete = function(name) {
+ this.set(name, null, { expires: 0 });
+ };
+}();
-var Cookie = function(name, value, options) {
+cookies.Cookie = function (name, value, o) {
+ var opts = o || {};
this.name = name;
this.value = value;
-
- options = options || {};
- this.path = options.path || '/';
-
- this.expires = null;
-
- if (options.lifetime != null) {
- this.expires = new Date(Date.now() + options.lifetime).toGMTString();
+ this.path = opts.path || '/';
+ this.expires = opts.expires || null;
+ this.domain = opts.domain || null;
+ this.httpOnly = opts.httpOnly || false;
+ this.send = false;
+
+ if (opts.lifetime != null) {
+ this.expires = new Date(Date.now() + opts.lifetime).toGMTString();
}
-
- this.domain = options.domain || null;
- this.httpOnly = options.httpOnly || true;
- this.send = true;
-
- this.toString = function() {
- var arr = [this.name +'='+ this.value];
- var keys = ['path', 'expires', 'domain'];
-
- for (var i=0; i<keys.length; i++) {
- key = keys[i];
-
- if (this[key]) {
- arr.push(key +'='+ this[key]);
- }
- }
-
- if (this.httpOnly) {
- arr.push('HttpOnly');
+};
+
+cookies.Cookie.prototype.toString = function () {
+ var res = [this.name + '=' + this.value];
+ var keys = ['path', 'expires', 'domain'];
+ var key;
+ var str;
+ for (var i = 0; i < keys.length; i++) {
+ key = keys[i];
+ if (this[key]) {
+ res.push(key + '=' + this[key]);
}
-
- return arr.join('; ');
}
-}
+ if (this.httpOnly) {
+ res.push('HttpOnly');
+ }
+ str = res.join('; ');
+ return str;
+};
+
+module.exports = cookies;
App.on('request', function(Request, Response, callback) {
- var Cookies = new Katana.Core.Cookie;
-
- Cookies.parse(Request);
-
- Request.cookie = Cookies;
+ Request.cookie = new cookies.CookieCollection(Request.request);
callback();
});
App.on('send_response', function(Response, Request, callback) {
App.series('cookie.send', function() {
- Response.header('Set-Cookie', Request.cookie.to_array());
+ Response.header('Set-Cookie', Request.cookie.toArray());
callback();
}, Response, Request);
});
-
-module.exports = Katana.Core.Cookie;
View
2  lib/session/store.js
@@ -32,7 +32,7 @@ Role('Katana.Core.Session.Store', {
},
delete: function(name) {
- if (!key) { this.data = {}; return; }
+ if (!name) { this.data = {}; return; }
if (this.data[name] !== undefined) {
return delete this.data[name];
View
30 lib/static.js
@@ -2,22 +2,26 @@ var server = new (require('node-static').Server)('./');
var config = App.Config();
+if (config.static.error_log === undefined) {
+ config.static.error_log = false;
+}
+
App.on('connection', function(request, response, callback) {
if (request.url == '/favicon.ico') {
- request.url = config.static.path + 'favicon.ico';
+ request.url = '/'+ config.static.path + 'favicon.ico';
}
-
+
if (config.static.enabled && request.url.indexOf('/'+ config.static.path)===0) {
- server.serve(request, response, function(error, resp) {
- if (error) {
- error.url = request.url;
-
- console.log(error);
- }
- });
-
- return callback(true);
+ server.serve(request, response, function(error, resp) {
+ if (error) {
+ error.url = request.url;
+
+ config.static.error_log && console.log(error);
+ }
+ });
+
+ return callback(true);
}
-
+
callback();
-});
+});
View
281 readme.md
@@ -1,8 +1,8 @@
# [Katana](https://github.com/Shogun147/Katana)
-使いやすい、Node.jsの侍たちの為のHMVCスケーラブルなWEBフレームワーク
+Easy to use, modular web framework for any Node.js samurai, focuses on simplicity, maintainability and performance.
-## コンテンツ
+## Contents
* [Features](#features)
* [Installation](#installation)
@@ -22,36 +22,36 @@
## Features
-* 強力で柔軟性のあるクラシカルなルータ
-* スケーラブルなHMVCアーキテクチャ
-* 環境ベースのコンフィギュレーション
-* アプリケーションのクイックジェネレータ
-* Cookieとセッションのサポート
-* テンプレート、パーシャルをサポート
-* 完全にノンブロッキング
+* Powerful, flexible classical router
+* Scalable through HMVC architecture
+* Environment based configuration
+* Application quick generators
+* Cookies and Session support
+* Templating, partials support
+* Fully non-blocking
*
## Installation
-Katanaを最も早く使うには、npmでインストールすることです。
+Fastest way to get Katana is to install it with NPM:
$ npm install -g katana
## Quick start
-最も簡単に開始する方法は、アプリケーションを生成するKatana利用して実行することです。
+The quickest way to start is to utilize the Katana executable to generate an application:
$ katana create app
$ cd app
$ npm install
-アプリのパスはオプションであり、現在のパスからの相対パスです。
+The app path is optional and is relative to current path.
-これで、サーバを起動する準備が整いました。
+Then you are ready to start the server:
$ node app
-### 作成後の基本的なアプリケーションのレイアウトは次のようになります。
+### Basic application layout after creation will look like this:
.
├── app.js
├── application
@@ -75,43 +75,42 @@ Katanaを最も早く使うには、npmでインストールすることです
## Routing
-クラシカルなルーティングは、Katanaのフレームワークの中で最も強力なfutureの一つです。 これは、リクエストされたURIに対応するコントローラとアクションを決定するためにURIセグメントを使用しています。<br>
-その為、他のNode.js フレームワークとは異なり、ルーティング ルールを作成することなく、コントローラーとアクションを追加するだけで、パスを変更でき、独自のルールを書くこともできます。<br>
-ルールがない場合、URIパスとして扱われます: http://katana:8000/`controller`/`action`/`arg1`/../`argN`
+Classical routing is one the most powerful futures of Katana framework. It uses uri segments to determine the controller and action for a requested URI.<br>
+So unlike in other Node.js framework you may just add controllers and actions without the need to create routing rules, but also let you write your own rules which may change the path.<br>
+Without any rules, uri path will be treated as: http://katana:8000/`controller`/`action`/`arg1`/../`argN`
-もしそうであればURIのパスは次のとおりです。 `http://katana:8000/account/login`<br>
-そして `controller=account` `action=login` です。
+So if uri path is: `http://katana:8000/account/login`<br>
+Then `controller=account` and `action=login`.
-URIセグメントがない場合、デフォルトパスは、`home`コントローラの`index`アクションが使用されます。
+If there no uri segments then default path will be used, `home` as controller and `index` as action.
-また、ユーザー·プロファイルを表示するような場合、ルーティングルールを設定することによって、パスを書き換えることができます。
+You can also rewrite path by set the routing rule, for example to view user profile:
routes: {
- // 各リクエストメソッドは自身のルート(経路)があります。
+ // each request method may have it's own routes
get: [
['user/:user_id', 'users/profile']
]
- // すべてのメソッドのためのルート(経路)を設定することもできます。
+ // also you can set routes for all methods
all: [
- // リクエストされたメソッドをルート(経路)が一致しない場合は、このルートをしようとします
+ // if routes will not match for requested method then will try this routes
]
}
-または、ルートプレフィックスとしてリクエストメソッドを設定できます:
+or you may set request method as route prefix:
routes: [
- ['get user/:user_id', 'users/profile'], // これは get メソッドをルーティングします。
- ['* user/:user_id', 'users/profile'] // すべてのメソッド
- ['user/:user_id', 'users/profile'] // 設定されていない場合は、すべてのメソッドをチェックします
+ ['get user/:user_id', 'users/profile'], // will route this for get method
+ ['* user/:user_id', 'users/profile'] // all methods
+ ['user/:user_id', 'users/profile'] // if not set then will check all methods
]
-これは、`controller=users`
-`action=profile`を設定し、user_idは`Request.params.user_id`として利用できるようになります。
+This will set `controller=users` and `action=profile` and user_id will be available as `Request.params.user_id`.
-または、MVCモジュールにこのリクエストを渡すことができます:
+Or you may pass this request to mvc module:
routes: {
get: [
@@ -119,10 +118,9 @@ URIセグメントがない場合、デフォルトパスは、`home`コント
]
}
-このリクエストは、`auth`モジュール、`controller=users`
-`action=profile`をパスする`#`シンボルを意味します。
+The `#` symbol meen that this request will pass to `auth` module, `controller=users` and `action=profile`.
-また、次のようuser_idの書式を設定することができます:
+You could also set format for user_id like so:
routes: {
get: [
@@ -130,9 +128,9 @@ URIセグメントがない場合、デフォルトパスは、`home`コント
]
}
-`!重要:` MVCモジュールは、独自のルーティングルールを持っているかもしれません。
+`!important:` mvc modules may have their own routing rules.
-その他の例:
+More examples:
['news/:category/rss.:format(xml|json)?', 'news/rss'] will allow:
news/any_category/rss
@@ -143,7 +141,7 @@ URIセグメントがない場合、デフォルトパスは、`home`コント
methods: {
rss: function(Response, Request) {
- // 今、Request.params.categoryとRequest.params.formatを使用することができます
+ // Now we can use Request.params.category and Request.params.format
var format = Request.params.format || 'xml'; // default xml
...
@@ -152,59 +150,36 @@ URIセグメントがない場合、デフォルトパスは、`home`コント
## Modules
-Katanaでは、モジュールはMVCの一部のアプリケーションとして、またはミドルウェアとして使用することができます。
+In Katana modules can be used as mvc part or your application or as middleware.
-MVCモジュールの場合は、メインMVCのと同じようにルーティングを使用することができます。<br>
-また、runメソッドを呼び出すことにより、ウィジェットとしてそれらを実行することができます:
+For mvc modules you can use routing the same way as for main mvc.<br>
+Also you can run them as widgets by calling run method:
Module('auth').run('users/list');
-これは、`auth`モジュールから`users`コントローラの`list`アクションを実行します。
+This will run `list` action of `users` controller from `auth` module.
-ミドルウェア モジュールは特定のアプリケーション イベントをリッスンし、彼らが必要とする対話をすることができます。
+Middleware modules can listen specific application events and interact as they need.
-例えばauthモジュールは次のようになります。
+For example auth module can look like this:
- var User = App.Model('auth:user'); // authモジュールのuserモデルを取得
+ var User = App.Model('auth:user'); // get user model of auth module
// listen new request event
App.on('request', function(Request, Response, callback) {
Request.user = new User(Request.session);
- callback(); // アプリケーションが続行に必要な作業が終わったときのコールバック
+ callback(); // callback when we're done here, required for application to continue
});
-その後コントローラからユーザーオブジェクト 'Request.user' としてアクセスできます。
+and then in our controller we can access user object as `Request.user`.
### Sharing modules
-[Katana](https://github.com/Shogun147/Katana)
-はパブリックモジュールをダウンロードしてアプリケーションにインストールができる共有システム基本モジュールが付属しています。
-
-Katanaバイナリがモジュールと対話するためにいくつかの新しいコマンドがあります。
-
-* `katana modules` - 使用可能なすべてのモジュールを一覧表示。
-* `katana modules-search <str>` - 'str' を含むモジュール名または記述を検索します。
-* `katana modules-update` - モジュールのリストの関連情報を更新します。
-* `katana modules-install <name> [url]` - アプリケーションモジュールのインストールまたは再インストールを行います。 * `name` or `name@version` -モジュール名
- * `url` or `username:repository` or `username:repository@version` - オプションurlまたは github username:repositoryの組み合わせ
-
- `name` のみが提供された場合は、ダウンロードURLはモジュールレジストリファイルに含まれるモジュールのデータからビルドされます。名前は、バージョンタグが続く場合があります。<br>
- 2番目の引数が url の場合はモジュールはその url からダウンロードされます。<br>
- 2番目の引数が、 `username:repository@version` の組み合わせはurlです: `https://github.com/:username/:repository/tarball/:version` <br>
- `version` がない場合は、要求されたものは、レジストリ内のモジュールに対して使用可能な最後のバージョンになるでしょう。有効なバージョンが次に検出されない場合の `master` ブランチが要求されます。<br>
- カスタムダウンロードURLモジュールの場合はgzipで圧縮されたtarballまだなければなりません。<br>
- インストール例:
- * `katana modules install auth`
- * `katana modules install auth@0.1.0`
- * `katana modules install Shogun147:Katana-auth`
- * `katana modules install Shogun147:Katana-auth@0.1.0`
- * `katana modules install https://github.com/Shogun147/Katana-auth/tarball/master`
- * `katana modules install http://my-site.com/downloads/module/v1.0.5`
-
-* `katana modules uninstall <name>` - モジュールをアンインストールし削除する
-* `katana modules enable <name>` - モジュールを有効にする
-* `katana modules disable <name>` - モジュールを無効にする
+[Katana](https://github.com/Shogun147/Katana) comes with an basic modules sharing system which allow to download public modules and install them for application.
+
+Katana binary has few new commands for interacting with modules:
+
* `katana modules` - list all available modules.
* `katana module search <str>` - search modules that contain `str` in name or description.
* `katana module update` - update modules list and their info.
@@ -212,22 +187,37 @@ Katanaバイナリがモジュールと対話するためにいくつかの新
* `name` or `name@version` - module name
* `url` or `username:repository` or `username:repository@version` - optional url or github username:repository combination.
-このアクション [`install`, `uninstall`, `enable`, `disable`] のそれぞれに対してモジュールが呼びだされ、それらはhookを持っている可能性があります。hookは、モジュールのhooksディレクトリに格納されています。<br>
-hookはこのアクションにユニークな何かをする必要があるときに便利です。 例えば、 `install` (modules/:name/hooks/install.js) hookは、publicディレクトリにデータベースまたはコピーモジュール資産の新しいテーブルを作成することができます...
+ If only `name` is provided then download url will be builded from module data contained in modules registry file. The name could also be followed by an version tag.<br>
+ If second argument is an url then module will be downloaded from that url.<br>
+ If second argument is an combination of `username:repository@version` then the url will be: `https://github.com/:username/:repository/tarball/:version`.<br>
+ If no `version` provided then requested one will be last available version for module in registry. If no valid version will be detected then `master` brunch will be requested.<br>
+ For custom download url modules still must be gzipped tarballs.<br>
+ Examples of install:
+ * `katana module install auth`
+ * `katana module install auth@0.1.0`
+ * `katana module install Shogun147:Katana-auth`
+ * `katana module install Shogun147:Katana-auth@0.1.0`
+ * `katana module install https://github.com/Shogun147/Katana-auth/tarball/master`
+ * `katana module install http://my-site.com/downloads/module/v1.0.5`
+
+* `katana module uninstall <name>` - uninstall and remove module
+* `katana module enable <name>` - enable module
+* `katana module disable <name>` - disable module
+
+For each of this actions [`install`, `uninstall`, `enable`, `disable`] modules could have their hooks which would be called. The hooks are stored in hooks directory of module.<br>
+The hooks are useful when there is a need to do something unique on this actions. For ex the `install` hook (modules/:name/hooks/install.js) could create new tables in the database or copy modules assets to public directory…
-モジュールのレジストリは `https://raw.github.com/Shogun147/Katana/master/modules.json`
-からダウンロードされます。 リストに新しいモジュールを追加するには、単にこのファイルをforkしてpullリクエストを送信します。
-これは、`katana modules` コマンドと検索記載される、あなたのモジュールになります。
+The module registry is downloaded from `https://raw.github.com/Shogun147/Katana/master/modules.json`. To add new modules to the list just fork this file and send an pull request. This will make your module listed on `katana modules` command and on search.
## Controllers
-コントローラは、あらゆるアプリケーションの最も重要な部分であり、それらは、着信リクエストを処理し、レスポンスを送信する。
+Controllers are almost most important part of any application, they handle incoming requests and send responses.
-シンプルなコントローラは次のようになります。
+A simple controller looks like this:
- // 独自のコントローラクラスを定義する
+ // define our controller Class
Class('Home_Controller', {
- isa: App.Controller, // Katanaコアコントローラを拡張
+ isa: App.Controller, // extend Katana Core Controller
methods: {
index: function(Response, Request) {
@@ -238,19 +228,13 @@ hookはこのアクションにユニークな何かをする必要があると
module.exports = new Home_Controller;
-http://katana:8000/を開くことにより、この`index`アクションにアクセスすることができます。任意のURIパスがないので、
-configのdefaultのコントローラの`home`とアクション`index`を使用します。また直接
-http://katana:8000/`home`/ と `index` の defaultアクション まてゃ
-http://katana:8000/`home`/`index` を開きアクセスすることができます。
+And now we can access this `index` action by opening http://katana:8000/, without any uri path this will use default controller and action from config which are `home` and `index`. Also we can access them directly by opening http://katana:8000/`home`/ with `index` as default action or http://katana:8000/`home`/`index`.
### Hooks
-Joose [Method
-Modifiers(メソッド修飾子)]の力で(http://joose.github.com/Joose/doc/html/Joose/Manual/MethodModifiers.html)
-(`before`, `after`, `override` and `around`) クラスのメソッドを呼び出す前、
-またはメソッドの呼び出し後に発生する可能性があるアクションの結果を変更し、returnすることができます。
+Due the power of Joose [Method Modifiers](http://joose.github.com/Joose/doc/html/Joose/Manual/MethodModifiers.html) (`before`, `after`, `override` and `around`) we may change the way class methods are called, actions that may happen before or after method call or even modify results that they could return.
-例えばindexメソッドはログインユーザーのみという制限をしましょう:
+For example let's restrict index method only for logged in users:
Class('Home_Controller', {
isa: App.Controller,
@@ -262,24 +246,24 @@ Modifiers(メソッド修飾子)]の力で(http://joose.github.com/Joose/doc/htm
},
around: {
- // ラップしたいメソッドと同名
+ // the same name for the method we want to wrap
index: function(method, Response, Request) {
var User = Request.user;
- // ユーザがログインしていない場合、次のログインページにリダイレクト
+ // if the user is not logged in then redirect to login page
if (!User.logged_in()) {
return Request.redirect('/login');
}
- // 他に、元のメソッドを呼び出す
+ // else wee call original method
method(Response, Request);
}
}
});
-`call`修飾子は、正規表現を使用してフック条件に一致するすべてのメソッドに適用することができます。
+The `call` modifier allow as to use regular expressions and apply that hook to all methods that matches the condition.
-例えば、すべてのメソッドに対してアクセスを制限しましょう:
+For example let's restrict access for all methods:
Class('Home_Controller', {
isa: App.Controller,
@@ -291,17 +275,17 @@ Modifiers(メソッド修飾子)]の力で(http://joose.github.com/Joose/doc/htm
},
call: {
- // メソッド名の代わりに正規表現を使う
- // これは、すべてのコントローラのメソッド呼び出しに適用されます
+ // use regexp instead of methods name
+ // this will apply to all controller methods calls
'.*': function(method, Response, Request) {
var User = Request.user;
- // ユーザがログインしていない場合、次のログインページにリダイレクト
+ // if the user is not logged in then redirect to login page
if (!User.logged_in()) {
return Request.redirect('/login');
}
- // 他に、元のメソッドを呼び出す
+ // else we call original method
method(Response, Request);
}
}
@@ -310,19 +294,17 @@ Modifiers(メソッド修飾子)]の力で(http://joose.github.com/Joose/doc/htm
## Models
-Katanaは何らかの方法でモデルを定義する場合や、特定のモジュールを使用する開発者を制限しませんでした。
-それだけで、アプリケーションのモデル·ディレクトリまたはモジュールからすべてをオートロードし、ローカルレジストリに格納します。
+Katana did not limit the developer to define a model in some way or to use a specific module. It just autoload all from the models directory of application or a module and store them in a local registry.
-アクセスするには次のようになります:<br>
+You can access them like this:<br>
- var News = App.Model('news'); // モデルオブジェクトを取得
+ var News = App.Model('news'); // get model object
-モジュールからモデルを取得するには、コロン`:` でモジュール名とモデル·パスを分離する必要があります。
-例えば、`auth`モジュールの呼び出しと`user`モデルの取得は、 `App.Model('auth:user')`
+To get a model from module you need to separate module name and model path with colon `:`, for example to get `user` model of `auth` module call: `App.Model('auth:user')`.
-モデルファイルは次のようになります:
+Model file can look like this:
- var Mongoose = App.Store('mongoose'); // 格納されている設定ファイルを見て、mongooseの接続を取得
+ var Mongoose = App.Store('mongoose'); // get mongoose connection, look at stores config file
var Schema = require('mongoose').Schema;
var User = new Schema({
@@ -337,7 +319,7 @@ Katanaは何らかの方法でモデルを定義する場合や、特定のモ
## Views
-viewをレンダリングするには、いくつかの方法を使用できます。
+To render a view you can use a few methods:
var View = App.View;
@@ -346,19 +328,19 @@ viewをレンダリングするには、いくつかの方法を使用できま
methods: {
index: function(Response, Request) {
- // 直接viewのコンテンツをレンダリングして送信
+ // directly render and send a view content
Response.render('index', { title: 'Hello World' }); // this will render index.html file from views
- // コンテンツをレンダリング
+ // get rendered content
var content = View.render('index', { title: 'Hello World' });
- // その後、レスポンスを送信
+ // and latter send response
Response.send(content);
- // モジュールからviewをレンダリング
+ // render a view from module
Users.find({}, function(error, users) {
if (error) { return Response.send('Error! Blablabla'); }
- // もう一度viewでモジュール名はパスとコロンで区切られる
+ // again module name separated by colon, and then path to the view
var list = View.render('auth:list', users);
Response.render('index', { users: list });
@@ -367,13 +349,13 @@ viewをレンダリングするには、いくつかの方法を使用できま
}
});
-コントローラもthis.renderの呼び出しに渡されるグローバルデータを持つことができます:
+Controllers can also have their global data, which will be passed for the this.render calls:
Class('Home_Controller', {
isa: App.Controller,
have: {
- // グローバルデータをコントローラに設定
+ // set global controller data
data: {
title: 'This is title for all pages for this controller',
total_requests: 0
@@ -382,15 +364,15 @@ viewをレンダリングするには、いくつかの方法を使用できま
methods: {
index: function(Response) {
- // アクションからグローバルデータをコントローラーに設定することもできます。
+ // you can also set global controller data from actions
this.set('copyright', 'blablabla');
- // または
+ // or
this.data.total_requests++;
- // this.renderメソッドを使用してビューをレンダリングすることにより、コントローラのデータは、このビューに渡します
+ // by render the view with this.render method, the controller data will pass to this view
var content = this.render('index'); // <?-title?>, <?-total_requests?>
- // また、レンダリングにそれらを設定することによって、グローバルを書き換える場合があります
+ // we may also rewrite globals by set them on render
var content = this.render('index', { title: 'This is rewritted title', foo: 'bar' });
Response.send(content);
@@ -400,16 +382,17 @@ viewをレンダリングするには、いくつかの方法を使用できま
## Events
-Katanaアプリケーションは、特定のイベントを別の手順でします。それらのいくつかはミドルウェアで利用可能で、それ以外は、ブートストラップ制御フローのためのものです。
+Katana application emit specific events for different steps.
+Few of them are available for middlewares, the others are for bootstrap control flow.
-例えば、`auth`モジュールが(Modulesを参照)のリクエストに対して、userモデルを割り当てるために`request`イベントをリッスンすることができます。
+For example, `auth` module can listen `request` event to assign a user model for request (see Modules).
-または、アプリケーションサーバで`chat`モジュール作成する場合、socket.ioサーバを必要になります。
+Or a `chat` module which need application server to create a socket.io server.
var socket_io = require('socket.io');
var io;
- // Http.Serverがリスニング開始準備ができたらイベントを発行します
+ // ready event is emitted when Http.Server start listening
App.on('ready', function(callback) {
io = socket_io.listen(App.server);
@@ -422,80 +405,78 @@ Katanaアプリケーションは、特定のイベントを別の手順でし
## Sessions
-Katanaはセッションをサポートするためのモジュールで構築しています。アプリのそれぞれの特定の訪問者をデータで関連付け、そのデータがリクエスト間で永続化するように設定する方法を示します。
+Katana has build in module for supporting sessions.
+This gives you a way to associate data with each particular visitor of your app and have that data persist between requests.
### Data stores
-今、Katanaは2つのセッションデータストアをサポートしています。(もっと来て)
+For now Katana support only 2 session data stores (more to come):
-* **Memory** (デフォルト):
- 開発に便利です。セッションデータは、ワーカー·プロセス·レベルでのメモリーに保存され、これは、クラスタで動作しないことを意味します。アプリを再起動したときにも、すべてのセッションが消失されます。
+* **Memory** (by default): useful for development. Session data is saved in memory at worker-process level, which means this will not work with cluster. Also, all sessions disappear when app is restarted.
-* **Redis**:
- セッションはRedisのNOSQLデータベースに保存され、アプリを再起動しても持続されています。Redisのサーバーまたはclusterを必要とします。
+* **Redis**: Sessions are saved in a redis noSQL database and persist across app restarts. Requires a Redis server or clusters.
### Using sessions
-まずアプリケーション構成ファイルにセッションを有効にする必要があります。 デフォルトのセッションは、次のようになります。
+First of all you need to enable sessions in application config file.
+The default session config look like this:
session: {
- // セッションのサポートを有効または無効にする
+ // enable or disable session support
enabled: true,
- // cookieのセッション識別子名
+ // session identifier name for cookie of
key_name: 'session_id',
- // セッションIDの長さ
+ // session id length
key_length: 32,
- // 非アクティブなセッションを削除する前の有効期間
+ // lifetime before delete inactive session
lifetime: 1000 * 60 * 60 * 24 * 7,
- // セッションストアは,1つの config/stores.js から
+ // session store, one from config/stores.js
store: 'redis',
- // 新規セッションのデフォルトのデータ
+ // default data for new sessions
defaults: {
}
}
-いったんセッションを有効にすると、セッションオブジェクトは、各リクエストに割り当てられ、
-データは、セッションストアから自動的にロードされます。このオブジェクトは
-`Request.sessionの`としてアクセスすることができます。今のところは利用できるpublicメソッドは`set``get``remove`です。
+Once you enable sessions, the session object will be assigned to each request and data will be loaded automatically from the session store.
+Then this object could be accessed as `Request.session`.
+For now available public methods are `set`, `get` and `remove`.
-ユーザーリクエストのカウンターの例
+Example counter of user requests:
index: function(Response, Request) {
var Session = Request.session;
- // 現在のリクエスト数、デフォルトの0(ゼロ)を得る
+ // get current requests count, default 0
var counter = Session.get('requests', 0);
counter++;
- // 新しい値を設定
+ // set new value
Session.set('requests', counter);
- // セッションデータは、自動的にレスポンスを送信する前にストアに保存されます
- // また、configのkey_nameからCookieにセッションIDを保存します。
+ // Session data will be automatically saved in store before sending response
+ // Also will save session id in the cookie with key_name from config
Response.send('You have visited this page '+ counter +' times');
}
## Logging
-Katanaはログモジュール [winston](https://github.com/flatiron/winston)を使用しています。
-`App.log`として使用されており、多くのトランスポートやオプションを追加できます。 公式のドキュメントを確認してください。
+Katana uses [winston](https://github.com/flatiron/winston) module to log.
+Available as `App.Log` you could add more transports or options to it. Check official docs for this.
## Examples
* [ToDo](https://github.com/Shogun147/Katana-ToDo) - Simple todo application
## Contributing
-興味があったり、どなたでもフレームワークの新しいアイデア、issueやpullリクエストを送って頂くことで、貢献頂けます。
-お手伝い頂けるとありがたいです。
+Anyone interested or who like the framework idea can contribute by sending new ideas, issues or pull requests. Any help would be appreciated.
## License
The MIT License
Copyright © 2012 D.G. Shogun <Shogun147@gmail.com>
-translate © 2012 dai_yamashita
View
505 readme_ja.md
@@ -0,0 +1,505 @@
+# [Katana](https://github.com/Shogun147/Katana)
+
+<<<<<<< HEAD
+使いやすい、Node.jsの侍たちの為のHMVCスケーラブルなWEBフレームワーク
+=======
+Easy to use, modular web framework for any Node.js samurai, focuses on simplicity, maintainability and performance.
+>>>>>>> 758dd6728fd7efc5be2da32953381c90fb6618cf
+
+## コンテンツ
+
+* [Features](#features)
+* [Installation](#installation)
+* [Quick start](#quick-start)
+* [Routing](#routing)
+* [Modules](#modules)
+* [Controllers](#controllers)
+ * [Hooks](#hooks)
+* [Models](#models)
+* [Views](#views)
+* [Events](#events)
+* [Sessions](#sessions)
+* [Logging](#logging)
+* [Examples](#examples)
+* [Contributing](#contributing)
+* [License](#license)
+
+## Features
+
+* 強力で柔軟性のあるクラシカルなルータ
+* スケーラブルなHMVCアーキテクチャ
+* 環境ベースのコンフィギュレーション
+* アプリケーションのクイックジェネレータ
+* Cookieとセッションのサポート
+* テンプレート、パーシャルをサポート
+* 完全にノンブロッキング
+*
+
+## Installation
+
+Katanaを最も早く使うには、npmでインストールすることです。
+
+ $ npm install -g katana
+
+## Quick start
+
+最も簡単に開始する方法は、アプリケーションを生成するKatana利用して実行することです。
+
+ $ katana create app
+ $ cd app
+ $ npm install
+
+アプリのパスはオプションであり、現在のパスからの相対パスです。
+
+これで、サーバを起動する準備が整いました。
+
+ $ node app
+
+### 作成後の基本的なアプリケーションのレイアウトは次のようになります。
+ .
+ ├── app.js
+ ├── application
+ │   ├── config
+ │   │   ├── development
+ │   │   │   ├── application.js
+ │   │   │   ├── routing.js
+ │   │   │   └── stores.js
+ │   │   └── production
+ │   ├── controllers
+ │   │   └── home.js
+ │   ├── models
+ │   └── views
+ │   └── index.html
+ ├── modules
+ ├── public
+ │   ├── images
+ │   ├── scripts
+ │   └── styles
+ └── temp
+
+## Routing
+
+クラシカルなルーティングは、Katanaのフレームワークの中で最も強力なfutureの一つです。 これは、リクエストされたURIに対応するコントローラとアクションを決定するためにURIセグメントを使用しています。<br>
+その為、他のNode.js フレームワークとは異なり、ルーティング ルールを作成することなく、コントローラーとアクションを追加するだけで、パスを変更でき、独自のルールを書くこともできます。<br>
+ルールがない場合、URIパスとして扱われます: http://katana:8000/`controller`/`action`/`arg1`/../`argN`
+
+もしそうであればURIのパスは次のとおりです。 `http://katana:8000/account/login`<br>
+そして `controller=account``action=login` です。
+
+URIセグメントがない場合、デフォルトパスは、`home`コントローラの`index`アクションが使用されます。
+
+また、ユーザー·プロファイルを表示するような場合、ルーティングルールを設定することによって、パスを書き換えることができます。
+
+ routes: {
+ // 各リクエストメソッドは自身のルート(経路)があります。
+ get: [
+ ['user/:user_id', 'users/profile']
+ ]
+
+ // すべてのメソッドのためのルート(経路)を設定することもできます。
+ all: [
+ // リクエストされたメソッドをルート(経路)が一致しない場合は、このルートをしようとします
+ ]
+ }
+
+または、ルートプレフィックスとしてリクエストメソッドを設定できます:
+
+
+ routes: [
+ ['get user/:user_id', 'users/profile'], // これは get メソッドをルーティングします。
+ ['* user/:user_id', 'users/profile'] // すべてのメソッド
+ ['user/:user_id', 'users/profile'] // 設定されていない場合は、すべてのメソッドをチェックします
+ ]
+
+
+これは、`controller=users`
+`action=profile`を設定し、user_idは`Request.params.user_id`として利用できるようになります。
+
+または、MVCモジュールにこのリクエストを渡すことができます:
+
+ routes: {
+ get: [
+ ['user/:user_id', '#auth/users/profile']
+ ]
+ }
+
+このリクエストは、`auth`モジュール、`controller=users`
+`action=profile`をパスする`#`シンボルを意味します。
+
+また、次のようuser_idの書式を設定することができます:
+
+ routes: {
+ get: [
+ ['user/:user_id([0-9]+)', '#auth/users/profile']
+ ]
+ }
+
+`!重要:` MVCモジュールは、独自のルーティングルールを持っているかもしれません。
+
+その他の例:
+
+ ['news/:category/rss.:format(xml|json)?', 'news/rss'] will allow:
+ news/any_category/rss
+ news/any_category/rss.xml
+ news/any_category/rss.json
+
+ and News controller:
+
+ methods: {
+ rss: function(Response, Request) {
+ // 今、Request.params.categoryとRequest.params.formatを使用することができます
+ var format = Request.params.format || 'xml'; // default xml
+
+ ...
+ }
+ }
+
+## Modules
+
+Katanaでは、モジュールはMVCの一部のアプリケーションとして、またはミドルウェアとして使用することができます。
+
+MVCモジュールの場合は、メインMVCのと同じようにルーティングを使用することができます。<br>
+また、runメソッドを呼び出すことにより、ウィジェットとしてそれらを実行することができます:
+
+ Module('auth').run('users/list');
+
+これは、`auth`モジュールから`users`コントローラの`list`アクションを実行します。
+
+ミドルウェア モジュールは特定のアプリケーション イベントをリッスンし、彼らが必要とする対話をすることができます。
+
+例えばauthモジュールは次のようになります。
+
+ var User = App.Model('auth:user'); // authモジュールのuserモデルを取得
+
+ // listen new request event
+ App.on('request', function(Request, Response, callback) {
+ Request.user = new User(Request.session);
+
+ callback(); // アプリケーションが続行に必要な作業が終わったときのコールバック
+ });
+
+その後コントローラからユーザーオブジェクト 'Request.user' としてアクセスできます。
+
+### Sharing modules
+
+[Katana](https://github.com/Shogun147/Katana)
+はパブリックモジュールをダウンロードしてアプリケーションにインストールができる共有システム基本モジュールが付属しています。
+
+Katanaバイナリがモジュールと対話するためにいくつかの新しいコマンドがあります。
+
+* `katana modules` - 使用可能なすべてのモジュールを一覧表示。
+* `katana modules-search <str>` - 'str' を含むモジュール名または記述を検索します。
+* `katana modules-update` - モジュールのリストの関連情報を更新します。
+* `katana modules-install <name> [url]` - アプリケーションモジュールのインストールまたは再インストールを行います。 * `name` or `name@version` -モジュール名
+ * `url` or `username:repository` or `username:repository@version` - オプションurlまたは github username:repositoryの組み合わせ
+
+ `name` のみが提供された場合は、ダウンロードURLはモジュールレジストリファイルに含まれるモジュールのデータからビルドされます。名前は、バージョンタグが続く場合があります。<br>
+ 2番目の引数が url の場合はモジュールはその url からダウンロードされます。<br>
+ 2番目の引数が、 `username:repository@version` の組み合わせはurlです: `https://github.com/:username/:repository/tarball/:version` <br>
+ `version` がない場合は、要求されたものは、レジストリ内のモジュールに対して使用可能な最後のバージョンになるでしょう。有効なバージョンが次に検出されない場合の `master` ブランチが要求されます。<br>
+ カスタムダウンロードURLモジュールの場合はgzipで圧縮されたtarballまだなければなりません。<br>
+ インストール例:
+ * `katana modules install auth`
+ * `katana modules install auth@0.1.0`
+ * `katana modules install Shogun147:Katana-auth`
+ * `katana modules install Shogun147:Katana-auth@0.1.0`
+ * `katana modules install https://github.com/Shogun147/Katana-auth/tarball/master`
+ * `katana modules install http://my-site.com/downloads/module/v1.0.5`
+
+* `katana modules uninstall <name>` - モジュールをアンインストールし削除する
+* `katana modules enable <name>` - モジュールを有効にする
+* `katana modules disable <name>` - モジュールを無効にする
+* `katana modules` - list all available modules.
+* `katana module search <str>` - search modules that contain `str` in name or description.
+* `katana module update` - update modules list and their info.
+* `katana module install <name> [url]` - install or reinstall app module.
+ * `name` or `name@version` - module name
+ * `url` or `username:repository` or `username:repository@version` - optional url or github username:repository combination.
+
+このアクション [`install`, `uninstall`, `enable`, `disable`] のそれぞれに対してモジュールが呼びだされ、それらはhookを持っている可能性があります。hookは、モジュールのhooksディレクトリに格納されています。<br>
+hookはこのアクションにユニークな何かをする必要があるときに便利です。 例えば、 `install` (modules/:name/hooks/install.js) hookは、publicディレクトリにデータベースまたはコピーモジュール資産の新しいテーブルを作成することができます...
+
+モジュールのレジストリは `https://raw.github.com/Shogun147/Katana/master/modules.json`
+からダウンロードされます。 リストに新しいモジュールを追加するには、単にこのファイルをforkしてpullリクエストを送信します。
+これは、`katana modules` コマンドと検索記載される、あなたのモジュールになります。
+
+## Controllers
+
+コントローラは、あらゆるアプリケーションの最も重要な部分であり、それらは、着信リクエストを処理し、レスポンスを送信する。
+
+シンプルなコントローラは次のようになります。
+
+ // 独自のコントローラクラスを定義する
+ Class('Home_Controller', {
+ isa: App.Controller, // Katanaコアコントローラを拡張
+
+ methods: {
+ index: function(Response, Request) {
+ Response.send('Hello World!');
+ }
+ }
+ });
+
+ module.exports = new Home_Controller;
+
+http://katana:8000/を開くことにより、この`index`アクションにアクセスすることができます。任意のURIパスがないので、
+configのdefaultのコントローラの`home`とアクション`index`を使用します。また直接
+http://katana:8000/`home`/ と `index` の defaultアクション まてゃ
+http://katana:8000/`home`/`index` を開きアクセスすることができます。
+
+### Hooks
+
+Joose [Method
+Modifiers(メソッド修飾子)]の力で(http://joose.github.com/Joose/doc/html/Joose/Manual/MethodModifiers.html)
+(`before`, `after`, `override` and `around`) クラスのメソッドを呼び出す前、
+またはメソッドの呼び出し後に発生する可能性があるアクションの結果を変更し、returnすることができます。
+
+例えばindexメソッドはログインユーザーのみという制限をしましょう:
+
+ Class('Home_Controller', {
+ isa: App.Controller,
+
+ methods: {
+ index: function(Response, Request) {
+ Response.send('Hello World!');
+ }
+ },
+
+ around: {
+ // ラップしたいメソッドと同名
+ index: function(method, Response, Request) {
+ var User = Request.user;
+
+ // ユーザがログインしていない場合、次のログインページにリダイレクト
+ if (!User.logged_in()) {
+ return Request.redirect('/login');
+ }
+
+ // 他に、元のメソッドを呼び出す
+ method(Response, Request);
+ }
+ }
+ });
+
+`call`修飾子は、正規表現を使用してフック条件に一致するすべてのメソッドに適用することができます。
+
+例えば、すべてのメソッドに対してアクセスを制限しましょう:
+
+ Class('Home_Controller', {
+ isa: App.Controller,
+
+ methods: {
+ index: function(Response, Request) {
+ Response.send('Hello World!');
+ }
+ },
+
+ call: {
+ // メソッド名の代わりに正規表現を使う
+ // これは、すべてのコントローラのメソッド呼び出しに適用されます
+ '.*': function(method, Response, Request) {
+ var User = Request.user;
+
+ // ユーザがログインしていない場合、次のログインページにリダイレクト
+ if (!User.logged_in()) {
+ return Request.redirect('/login');
+ }
+
+ // 他に、元のメソッドを呼び出す
+ method(Response, Request);
+ }
+ }
+ });
+
+
+## Models
+
+Katanaは何らかの方法でモデルを定義する場合や、特定のモジュールを使用する開発者を制限しませんでした。
+それだけで、アプリケーションのモデル·ディレクトリまたはモジュールからすべてをオートロードし、ローカルレジストリに格納します。
+
+アクセスするには次のようになります:<br>
+
+ var News = App.Model('news'); // モデルオブジェクトを取得
+
+モジュールからモデルを取得するには、コロン`:` でモジュール名とモデル·パスを分離する必要があります。
+例えば、`auth`モジュールの呼び出しと`user`モデルの取得は、 `App.Model('auth:user')`
+
+モデルファイルは次のようになります:
+
+ var Mongoose = App.Store('mongoose'); // 格納されている設定ファイルを見て、mongooseの接続を取得
+ var Schema = require('mongoose').Schema;
+
+ var User = new Schema({
+ username: String,
+ password: String,
+ email: String,
+ signed_at: Date,
+ roles: ['user', 'moderator', 'administrator']
+ });
+
+ module.exports = Mongoose.model('User', User);
+
+## Views
+
+viewをレンダリングするには、いくつかの方法を使用できます。
+
+ var View = App.View;
+
+ Class('Home_Controller', {
+ isa: App.Controller,
+
+ methods: {
+ index: function(Response, Request) {
+ // 直接viewのコンテンツをレンダリングして送信
+ Response.render('index', { title: 'Hello World' }); // this will render index.html file from views
+
+ // コンテンツをレンダリング
+ var content = View.render('index', { title: 'Hello World' });
+ // その後、レスポンスを送信
+ Response.send(content);
+
+ // モジュールからviewをレンダリング
+ Users.find({}, function(error, users) {
+ if (error) { return Response.send('Error! Blablabla'); }
+
+ // もう一度viewでモジュール名はパスとコロンで区切られる
+ var list = View.render('auth:list', users);
+
+ Response.render('index', { users: list });
+ });
+ }
+ }
+ });
+
+コントローラもthis.renderの呼び出しに渡されるグローバルデータを持つことができます:
+
+ Class('Home_Controller', {
+ isa: App.Controller,
+
+ have: {
+ // グローバルデータをコントローラに設定
+ data: {
+ title: 'This is title for all pages for this controller',
+ total_requests: 0
+ }
+ },
+
+ methods: {
+ index: function(Response) {
+ // アクションからグローバルデータをコントローラーに設定することもできます。
+ this.set('copyright', 'blablabla');
+ // または
+ this.data.total_requests++;
+
+ // this.renderメソッドを使用してビューをレンダリングすることにより、コントローラのデータは、このビューに渡します
+ var content = this.render('index'); // <?-title?>, <?-total_requests?>
+
+ // また、レンダリングにそれらを設定することによって、グローバルを書き換える場合があります
+ var content = this.render('index', { title: 'This is rewritted title', foo: 'bar' });
+
+ Response.send(content);
+ }
+ }
+ });
+
+## Events
+
+Katanaアプリケーションは、特定のイベントを別の手順でします。それらのいくつかはミドルウェアで利用可能で、それ以外は、ブートストラップ制御フローのためのものです。
+
+例えば、`auth`モジュールが(Modulesを参照)のリクエストに対して、userモデルを割り当てるために`request`イベントをリッスンすることができます。
+
+または、アプリケーションサーバで`chat`モジュール作成する場合、socket.ioサーバを必要になります。
+
+ var socket_io = require('socket.io');
+ var io;
+
+ // Http.Serverがリスニング開始準備ができたらイベントを発行します
+ App.on('ready', function(callback) {
+ io = socket_io.listen(App.server);
+
+ io.sockets.on('connection', function (socket) {
+ // …
+ });
+
+ callback();
+ });
+
+## Sessions
+
+Katanaはセッションをサポートするためのモジュールで構築しています。アプリのそれぞれの特定の訪問者をデータで関連付け、そのデータがリクエスト間で永続化するように設定する方法を示します。
+
+### Data stores
+今、Katanaは2つのセッションデータストアをサポートしています。(もっと来て)
+
+* **Memory** (デフォルト):
+ 開発に便利です。セッションデータは、ワーカー·プロセス·レベルでのメモリーに保存され、これは、クラスタで動作しないことを意味します。アプリを再起動したときにも、すべてのセッションが消失されます。
+
+* **Redis**:
+ セッションはRedisのNOSQLデータベースに保存され、アプリを再起動しても持続されています。Redisのサーバーまたはclusterを必要とします。
+
+### Using sessions
+
+まずアプリケーション構成ファイルにセッションを有効にする必要があります。 デフォルトのセッションは、次のようになります。
+
+ session: {
+ // セッションのサポートを有効または無効にする
+ enabled: true,
+
+ // cookieのセッション識別子名
+ key_name: 'session_id',
+
+ // セッションIDの長さ
+ key_length: 32,
+
+ // 非アクティブなセッションを削除する前の有効期間
+ lifetime: 1000 * 60 * 60 * 24 * 7,
+
+ // セッションストアは,1つの config/stores.js から
+ store: 'redis',
+
+ // 新規セッションのデフォルトのデータ
+ defaults: {
+
+ }
+ }
+
+いったんセッションを有効にすると、セッションオブジェクトは、各リクエストに割り当てられ、
+データは、セッションストアから自動的にロードされます。このオブジェクトは
+`Request.sessionの`としてアクセスすることができます。今のところは利用できるpublicメソッドは`set``get``remove`です。
+
+ユーザーリクエストのカウンターの例
+
+ index: function(Response, Request) {
+ var Session = Request.session;
+
+ // 現在のリクエスト数、デフォルトの0(ゼロ)を得る
+ var counter = Session.get('requests', 0);
+
+ counter++;
+
+ // 新しい値を設定
+ Session.set('requests', counter);
+
+ // セッションデータは、自動的にレスポンスを送信する前にストアに保存されます
+ // また、configのkey_nameからCookieにセッションIDを保存します。
+ Response.send('You have visited this page '+ counter +' times');
+ }
+
+## Logging
+
+Katanaはログモジュール [winston](https://github.com/flatiron/winston)を使用しています。
+`App.log`として使用されており、多くのトランスポートやオプションを追加できます。 公式のドキュメントを確認してください。
+
+## Examples
+
+* [ToDo](https://github.com/Shogun147/Katana-ToDo) - Simple todo application
+
+## Contributing
+興味があったり、どなたでもフレームワークの新しいアイデア、issueやpullリクエストを送って頂くことで、貢献頂けます。
+お手伝い頂けるとありがたいです。
+
+## License
+The MIT License
+
+Copyright © 2012 D.G. Shogun <Shogun147@gmail.com>
+translate © 2012 dai_yamashita
View
3  template/application/config/development/application.js
@@ -55,6 +55,7 @@ module.exports = {
max_age: 0,
hiddens: false,
- get_only: true
+ get_only: true,
+ error_log: false
}
}
Please sign in to comment.
Something went wrong with that request. Please try again.