JavaScriptでのクライアントサーバーインフラストラクチャの開発(パート2-サーバーとホスティング)

画像 こんにちは、この記事では、サーバー側について説明し、OpenShiftをホストするクラウドにアプリケーションを配置するプロセスについて説明します。



JavaScriptでのクライアントサーバーインフラストラクチャの開発(パート1-クライアント)



サーバーは、swagger-node-expressを使用してnodejsで記述されています。 これにより、 自動文書化の利点が得られます 。 サーバーは、クライアント部分をサポートするために作成されたので、いくつかのチェックと最適化は意図的に省略され、将来のために残されたことに注意したいです。



サーバーは一連のモジュールで構成されています。 メインファイルでは、すべてのモジュールが初期化されます。



var express = require("express"), swagger = require("./swagger"), orm = require('./orm'), auth = require('./auth'), config = require('./config'), static_files = require('./static'); var app = express(); app.use(express.bodyParser()); auth.init(app); orm.init(app); swagger(app); static_files(app); app.listen(config.listen, config.ipaddr);
      
      





メインモジュール。 認証には、httpヘッダーが使用され、その名前はパラメーターで設定できます。 セッションはmemcachedに保存され、api_key-> user_idと一致します。 ユーザー検証コード。



 var client = new memcache.Client(cfg.memcache.port, cfg.memcache.host); ... app.use(function(req, res, next){ client.get( req.headers[cfg.header.toLowerCase()], function(error, result){ if(result){ req.user = result; } next(); } ); req.memcache = client; });
      
      





データベースを操作するには、node-orm2が使用されます。 package.jsonには、使用するデータベースドライバーのみを追加します。

ベースへの接続とモデルの説明の例。



 app.use(orm.express(config.db, { define: function (db, models) { db.define("users", { id : Number, email : String, password : String, twitter : Number, facebook : Number, google : Number, linkedin : String }, { validations: { email: [ orm.enforce.unique("Email already taken!"), orm.enforce.unique({ ignoreCase: true }), orm.enforce.notEmptyString() ], password: orm.enforce.notEmptyString() }, id: "id", autoFetch: false } ); var Conferences = db.define("conferences", { id : Number, title : String, description : String, datetime : Date, place : String, location : String, site : String, logo : String, facebook : String, twitter : String, telephone : String, cost : String, file : String },{ id: "id", autoFetch: false } ); var Decisions = db.define("decisions", { id : Number, decision : ['go', 'not go', 'favorite'], user : Number, conference_id : Number },{ id: "id", cache: false, autoFetch: false } ); Decisions.hasOne('conference', Conferences, {reverse: 'decision'}); } }));
      
      





ローカルおよび私のVPSでは、nginxは静的に使用されますが、PaaSの場合、nodejs自体も静的をレンダリングするため、別のハンドラーを作成しました。 ドキュメントとクライアント自身を提供する必要があります。



 var static_handler = express.static(__dirname + '/../static/'); app.get(/^\/static(\/.*)?$/, function(req, res, next) { if (req.url === '/static') { // express static barfs on root url w/o trailing slash res.writeHead(302, { 'Location' : req.url + '/' }); res.end(); return; } req.url = req.url.substr('/static'.length); return static_handler(req, res, next); }); var main_handler = express.static(__dirname + '/../client/www/'); app.get(/^\/(.*)$/, function(req, res, next) { if(req.url == '/cordova.js'){ return res.send(''); } if(!req.url){ req.url = 'index.html'; } return main_handler(req, res, next); });
      
      





cordova.jsファイルはphonegapによって作成され、ハードウェアや他のプラットフォーム固有の機能と通信する機能が含まれています。 スタブはブラウザに渡されるだけなので、クライアントはOS機能を使用できないことを知っています。

次に、サーバー自体を初期化する必要があります。



 app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', cfg.header+', Content-Type'); res.header('Access-Control-Expose-Headers', cfg.header+', Content-Type'); if (req.method == 'OPTIONS') { res.send(200); } else { next(); } }); swagger.setAppHandler(app); swagger.addModels(models); controllers.init(swagger); swagger.configure(cfg.basePath, "0.1"); // Serve up swagger ui at /docs via static route var docs_handler = express.static(__dirname + '/../documentation/swagger/'); app.get(/^\/docs(\/.*)?$/, function(req, res, next) { if (req.url === '/docs') { // express static barfs on root url w/o trailing slash res.writeHead(302, { 'Location' : req.url + '/' }); res.end(); return; } // take off leading /docs so that connect locates file correctly req.url = req.url.substr('/docs'.length); return docs_handler(req, res, next); });
      
      





ブラウザからAPIを自由に使用できるように、クロスオリジンリソース共有ヘッダーが提供されます。 次に、盗品の初期化。 ここで注意する必要があります



 swagger.addModels(models); controllers.init(swagger);
      
      





与えられたこれらのモデルは、ViewModelに類似しており、orm.jsで説明されているモデルに属していないと言えます。 controllers.jsにアクションハンドラが登録されています。 例。



 swagger.addGET(conferences.get); swagger.addGET(conferences.list); swagger.addPOST(conferences.decision); swagger.addDELETE(conferences.reject);
      
      





アクションの記述方法。 IDで会議を受信するハンドラーの例を作成します。



 var get = { 'spec': { "description" : "Get conference by id", "path" : "/conferences.{format}/{id}", "notes" : "Get conference", "summary" : "Get conference", "method": "GET", "responseClass" : "Conference", "nickname" : "conference" }, 'action': function (req,res) { if (!req.params.id) { throw swagger.errors.invalid('id'); } var id = parseInt(req.params.id); req.db.models.conferences.get(id, function(err, conference){ if(err){ res.send(500, JSON.stringify({code: 500, header: 'Internal Server Error', message: JSON.stringify(err)})); }else{ if(conference){ if(conference.file){ conference.file = '/static/' + conference.file; } if(req.user){ conference.getDecision({user: req.user}, function(err, decision){ if(err){ res.send(500, JSON.stringify(err)); }else{ conference.decision = decision.pop(); res.send(200, JSON.stringify(conference)); } }); }else{ res.send(200, JSON.stringify(conference)); } }else{ throw swagger.errors.notFound('conference'); } } }); } };
      
      





「spec」は主にドキュメント情報ですが、ここに「path」、つまりexpressがハンドラーを呼び出すURLがあります。 主な部分はアクションです。 パラメータの存在とデータベースへのクエリがチェックされます。 コールバックが広範に成長することを好まない人は、すぐにnode-orm2を使用するとリクエストとハンドラの両方のチェーンを構築できると言います。 ファイルが会議に添付されている場合、それらのパスが生成されます。 ユーザーがログインしている場合、会議に関するユーザーの決定が求められます。 これは、httpリクエストを保存するために行われますが、正直に言って、RESTの観点からより良い、より正確な方法がわからないと言います。



これで、swagger-node-expressの操作の説明は終了したと思います。 プロジェクトが完成した外観になり始めるとすぐに、私はそれをどこに置くべきか疑問に思いました。 最初は彼は私のVPSに住んでいましたが、私は常にそこにすべてを張り付けているので、それをPaaSに置くことが決定されました。 雲はファッショナブルであるだけでなく、楽しいからです。 ちなみに、多くのクラウドホスティング企業は無料のアカウントを提供しており、その多くは時間制限なしで提供しています。 したがって、多数のプロジェクトを自由にホストできます。



この記事ではopenshiftについて説明していますが、私自身はopenshiftに関係していません。他のホスティングサービスでのホスティング手順は非常に似ています(git pushになります)。 偶然このホスティングを選択しました。



したがって、まだ登録していない場合は、最初に登録する必要があります。 次に、プロジェクトを作成し、そのドキュメントで詳細に説明します。 特に、いくつかのことに注意を向けたいと思います。 まず、クラウドでプロジェクトをホストすることを考えている場合、この特定のホスティングのためにプロジェクトをどこですぐにシャープにするかが最適です。 この方法で、デプロイメントの前にプロジェクトをやり直す必要がなくなります。たとえば、server.jsのメインファイルの名前を変更し、クライアントアプリケーションの静的のサポートを追加し、外部memcachedサーバーを使用する必要がありました。

クライアント/ wwwをサーバー/ wwwに移動し、会議に静的データを添付したディレクトリを追加して、そこでスワッガーしました。 これが、新しいstatic.jsの外観です。



 var static_handler = express.static(__dirname + '/www/static/'); app.get(/^\/static(\/.*)?$/, function(req, res, next) { if (req.url === '/static') { // express static barfs on root url w/o trailing slash res.writeHead(302, { 'Location' : req.url + '/' }); res.end(); return; } // take off leading /docs so that connect locates file correctly req.url = req.url.substr('/docs'.length); return static_handler(req, res, next); }); var main_handler = express.static(__dirname + '/www/'); app.get(/^\/(.*)$/, function(req, res, next) { if(req.url == '/cordova.js'){ return res.send(''); } if(!req.url){ req.url = 'index.html'; } return main_handler(req, res, next); });
      
      





第二に、SQL / no-SQLデータベースに関心を持ちます。データベースが独立している場合や、たとえば、オープンシフトなどがスロット全体を占有しているため、データベースが非常に少ないためです。 Memcachedを別のgarantiadata.comサービスに渡し、そこで試用アカウントも作成しました。 ところで、私はまだ2つのスロットを持っています。昨日、ノードの2番目のインスタンスも開始しました。

そして、はい、展開自体。



 git add --all; git commit -m 'commit'; git push origin master
      
      





原点を追加することを忘れないでください。これは、openshiftのアプリケーションページで取得できます。 また、アプリケーションにサービスの正しいホスト/ポートを示します。



 exports.listen = process.env.OPENSHIFT_NODEJS_PORT || 8080; exports.ipaddr = process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1";
      
      





ステータスを監視でき、git pushでログを取得できます。 また、sshで行ってtail_allを見ることができます。

sshを使用して、接続文字列を確認した後、データベースに接続することもできます。



 echo $OPENSHIFT_POSTGRESQL_DB_URL
      
      





クラウドでのプロジェクトはこれで終わりです。誰もが幸せです。 いつものように、私は批判と提案を喜んでいます。



All Articles