nodejs中間層実践(express)
14996 ワード
何がnodejs中間層ですか?
フロントエンド---要求-->nodejs----要求-->バックエンド----応答-->nodejs--データ処理---応答-->フロントエンド.このような流れのメリットは、業務のロジックが多すぎたり、業務の需要が絶えず変更されたりした時に、フロントエンドが多すぎず、業務のロジックを変えて後端と低結合することです.フロントエンドが表示され、レンダリングされます.バックエンドはデータを取得して保存します.中間層はデータ構造を処理し、フロントエンドにレンダリング可能なデータ構造を返す.
nodejsは中間層としての役割を果たしています.即ち、クライアントの要求に応じて、相応の処理やレンダリングページを行います.処理時は、取得したデータを簡単な処理として、下の階のjava側に任せて、本当のデータの恒久化やデータの更新をしてもいいです.
プロジェクト構築:
1.技術選択型で、expressフレーム開発中間層を選択しました.
2.
3.
3.
4.
ミドルウェアの作成:はディレクトリと一緒にファイルを作成して、自分で書いたミドルウェアを保存します.これはブロックとして使われます. 6.この中間部品の作成を開始する:
interceptor.js分割インターフェースリスト: index.js
superagentは、軽量級、柔軟的、読みやすい、低学習曲線のクライアント要求エージェントモジュールであり、NodeJS環境において使用される.superagent:visionmedia.github.io/superagent/
9.app.jsを再改造し、app.useをスクリーンセーバー、ap.use(interceptor)を使用させる.は、スクリーンセーバから返されたデータを処理する-->> たとえば:
11.環境変数の設定:ルートディレクトリのpackage.json種類にコマンドラインを設定する運転コマンドで、異なるスクリプトを実行します.
urlアドレスを読み込むファイルを作成します.
pm 2の運転環境変数は、pm 2ファイルを新規作成し、読み込みプロファイルを設定します.
中のウォッチはpm 2モニターのファイルです.fileはログログに出力されます.instancesは、実行スレッドの数です.
プロジェクトの開始:はサーバに置いてもいいです.ポートがnodejsの3000であると思わないなら、nginxでドメイン名をマッピングしてもいいです. 中間部品のパラメーターチェックはまだ完全に行われています.合理的ではありません.
転載先:https://juejin.im/post/5c9ae020e51d454901304b63
フロントエンド---要求-->nodejs----要求-->バックエンド----応答-->nodejs--データ処理---応答-->フロントエンド.このような流れのメリットは、業務のロジックが多すぎたり、業務の需要が絶えず変更されたりした時に、フロントエンドが多すぎず、業務のロジックを変えて後端と低結合することです.フロントエンドが表示され、レンダリングされます.バックエンドはデータを取得して保存します.中間層はデータ構造を処理し、フロントエンドにレンダリング可能なデータ構造を返す.
nodejsは中間層としての役割を果たしています.即ち、クライアントの要求に応じて、相応の処理やレンダリングページを行います.処理時は、取得したデータを簡単な処理として、下の階のjava側に任せて、本当のデータの恒久化やデータの更新をしてもいいです.
プロジェクト構築:
1.技術選択型で、expressフレーム開発中間層を選択しました.
2.
$ npm install express --save
.expressパッケージをダウンロードする.3.
$npm install express-generator -g
はexpressジェネレータを使用して、完成したプロジェクト構造を生成する.3.
$npm install pm2 -g
pm 2アプリケーション全体をダウンロードする.4.
$pm2 start express /bin/www --watch
expressプロジェクト、およびいくつかのファイルの変更を監督し、コードが変更されたら、自動的にnodejsサービスを再開します.ミドルウェアの作成:
interceptor.js
const log = require('../util/log');
// async 。
const async = require('async'),
NO_TOKEN = [
// token
'/api/login'
],
//
URL = require('../config');
/* */
const interceptor = (req, res ,next) =>{
res.result = {
code: 200,
data:""
}
console.log(' ');
log.info("********* **********");
//log.info("HOST:" + req.headers.host);
log.info("Authorization:" + req.headers['authorization']);
// res.send('**********repoert******');
try {
console.log(' ');
const origina_url = req.originalUrl;
const method = req.method;
log.info(origina_url);
log.info(method);
let count = 0, //
matchUrl = {}; //
// if(NO_TOKEN.indexOf(origina_url) < 0){
// if(req.headers){
// if(!req.headers['authorization'] || req.headers['authorization'] == ''){
// log.warn(' token ');
// console.log(' token ');
// res.result['code'] = 403;
// // next();
// return;
// }
// }
// }
log.info(` token`);
log.info(req.query);
// : url+ +
for(let i = 0; i < URL.length; i++){
let el = URL[i],
url = el['url'],
type = el['type'];
log.info(url);
log.info(method);
log.info(type);
log.info(url.test(origina_url));
if(url.test(origina_url) && type.test(method)){
log.info(' ')
// post ,
if(method !== 'GET'){
let init_params = el['params'],
init_params_length = init_params.length,
request_params = Object.keys(req.body),
request_params_length = request_params.length;
// ,
if(request_params_length !== init_params_length){
log.warn(" :" + request_params_length + " --- " + init_params_length);
console.log(" :" + request_params_length + " --- " + init_params_length);
continue;
}
// 0
// 0, post , get
if(init_params_length !== 0){
let params_count = 0; //
for(let sub_i = 0; sub_i < request_params_length; sub_i++){
let item = request_params[sub_i];
// , ++;
if(init_params.indexOf(item) != -1){
params_count++;
}
}
// ,
if(params_count !== init_params_length){
log.info('========== ========== ');
log.info(' :' + request_params);
log.info(' :' + init_params);
log.info(' ========== ========== ');
continue;
}
}
}
count++;
matchUrl = el;
break;
} else {
console.log(' ');
log.info(' ');
}
}
// 0,
if(count > 0){
log.info(' :' + matchUrl.name);
//
let request_params = JSON.stringify(method == "GET" ? req.query : req.body);
//
let target = matchUrl['target'],
target_length = target.length;
//async
if(target_length > 0){
let async_func = [
function (cb){
let _params = JSON.parse(request_params);
log.info(' :'+ request_params);
// token , token;
req.headers['authorization'] ?
function(){
log.info(' token:' + req.headers['authorization']);
_params['authorization'] = req.headers['authorization'];
}() : function(){
log.info(' token')
}();
cb(null, _params);
}
].concat(target);
log.info(target);
async_func = async_func.concat([
function(data,cb){
log.info(' :'+ JSON.stringify(data));
cb(null, data);
}
]);
//waterfall: 。 , 。
async.waterfall(async_func, (err, resultend)=>{
if(err){
res.result['code'] = err['httpStatus'];
next();
}
res.result['code'] = 200;
res.result['data'] = resultend;
next();
})
}
}
}
catch(err){
log.error('======== NODE =========');
log.error(err);
let errCode = err.statusCode;
switch(errCode){
case 400:
res.result['code'] = 400;
break;
default:
res.result['code'] = 500;
}
next();
}
}
module.exports = interceptor;
インターフェースリストの区分:const $http = require('../util/superagent');
const ENV = require('../config/url.config')
let login = [];
login = [
{
//
name: ' ',
//
url: /^\/list\/login$/i,
//
type: /^post$/i,
//
params: ['memberCellphone', 'loginPwd'],
//
target:[
function(initParam, cb){
let headers = {
"Content-Type":"application/json;",
}
$http('http://webapi.test.sxmaps.com/' + 'sapp/sapp-api/notfilter/member/login', 'post',initParam,{},function(err,res){
if(err){
cb(err,{});
return false;
}
// ,
let res_data = res;
cb(null, JSON.parse(res_data.text));
})
}
]
}
]
module.exports = login;
8.httpファイルのパッケージ.本明細書ではsuperagentライブラリを使用する.superagentは、軽量級、柔軟的、読みやすい、低学習曲線のクライアント要求エージェントモジュールであり、NodeJS環境において使用される.superagent:visionmedia.github.io/superagent/
//
const superagent = require('superagent');
const NODE_ENV = process.env.NODE_ENV;
// module.exports = superagent
/**
*
* $http(url, method, data, callback)
* @param {String} url
* @param {String} method
* @param {Obejct} data ,
* @param {Object} headers ,
* @param {Function} callback
*/
const $http = (url,method,data,headers,callback)=>{
const URL = url;
if(!url || !method || !data || !callback){
throw new Error(' ========== ========== ');
return false;
}
let _http = superagent;
log.info(' :' + url);
log.info(' :' + JSON.stringify(data));
switch (method) {
case 'get':
_http = _http.get(url).query(data);
break;
case 'put':
_http = _http.put(url).send(data);
break;
case 'delete':
_http = _http.del(url).send(data);
break;
default:
_http = _http.post(url).send(data);
break;
}
_http.end((err,res)=>{
callback(null, res);
})
}
module.exports = $http;
中間部品のロード:9.app.jsを再改造し、app.useをスクリーンセーバー、ap.use(interceptor)を使用させる.
app.use(interceptor);
app.use((req,res,next)=>{
}
app.use(interceptor);
app.use((req,res,next)=>{
let code = res.result['code'];
/* */
res.setHeader('Cache-Control', 'no-store');
switch(code){
case 403:
res.send({
code:403,
msg:' token',
});
default:
res.send(res.result['data']);
break;
}
let t = new Date() - req.time,
conntectStr = req.method + ' ' + req.url + ' ' + t + ' ms';
log4js.info(conntectStr);
next();
});
環境変数の設定:11.環境変数の設定:ルートディレクトリのpackage.json種類にコマンドラインを設定する運転コマンドで、異なるスクリプトを実行します.
urlアドレスを読み込むファイルを作成します.
pm 2の運転環境変数は、pm 2ファイルを新規作成し、読み込みプロファイルを設定します.
中のウォッチはpm 2モニターのファイルです.fileはログログに出力されます.instancesは、実行スレッドの数です.
プロジェクトの開始:
転載先:https://juejin.im/post/5c9ae020e51d454901304b63