ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejsサフィックス名判定限界コード_JavaScriptスキル

Nodejsサフィックス名判定限界コード_JavaScriptスキル

WBOY
WBOYオリジナル
2016-05-16 18:08:501320ブラウズ

現状: 冗長
Web 開発では、同じ機能を実装するために異なるプログラミング言語を使用することがよくありますか?
たとえば、ファイルのアップロード機能では、アップロードされるファイルのファイル形式の制限が必要です。通常、制限にはサフィックス名を使用します。

フロントエンド
ユーザーエクスペリエンスのために、ユーザーが選択したファイルはページ上で判断され、合法である場合にのみユーザーはファイルをアップロードできます。

コードをコピー コードは次のとおりです。

function is_filetype(filename,types) {
types = types.split(',');
var pattern = '.(';
for(var i=0; iif(0 ! = i) {
パターン = '|';
}
パターン = type[i].trim();
パターン = ')$'; RegExp(pattern , 'i').test(filename);

// ここで N 行のコードを省略します
if(!is_filetype($('#uploadfile') (), 'doc,pdf,txt,wps,odf,md,png,gif,jpg')){
can_submit = false; // アップロードは許可されません
$('#uploadfile').val ('') ;
alert('アップロードのみが許可されます: ' constant.RESUME_FILETYPES);
}
// ここでは N 行のコードが省略されています


バックエンド
悪意のあるアップロードの懸念から、ユーザーがアップロードしたファイルの再審査は避けられません。そこで、Python を使用してファイルのサフィックスを決定するロジックを作成しました



コードをコピーします コードは次のとおりです: import re
def is_filetype(filename,types):
types = types.split(',')
pattern = '.(' '|'.join([ t.strip( ) for t in type]) ')$';
return re.search(pattern, filename, re.I) != なし

# Web リクエスト ハンドラー
# 省略N 行コード


このように作業が重複する理由は何ですか?
1. フロントエンドは決して信頼できません。
2. フロントエンドとバックエンドは異なるプログラミング言語を使用します。
そのような冗長性のコストはどれくらいですか?
1. ビジネス ロジックを変更し、それを 2 回繰り返す必要があります。docx ファイル タイプがサポートされていないことが突然判明した場合は、JavaScript コードと Python コードを同時に変更する必要があります。
2. JavaScript コードと Python コードのビジネス ロジックの一貫性を確保するコスト。 2 種類のテストを別々に記述する必要があり、単体テストの実行時間は 2 倍になります。
nodejs 時代: DRY


nodejs
はもう使用しない

DRY !1 つのコード、フロントエンドとバックエンドを同時に実行


コードをコピーします コードは次のとおりです: // constant.js
(function(exports){

exports.RESUME_FILETYPES = 'doc,docx, pdf,txt,wps,odf,md,png,gif,jpg';

})((function(){
if(typeof exports ===) '未定義') {
window.constant = {};
return window.constant; else {
return エクスポート; >
// util.js
(function(exports){

/**
* 文字列の両端の空白文字を削除します
*
* @return {String}
* @api public
*/
String.prototype.trim = function(){
return this .replace(/(^s*) |(s*$)/g, "");

/**
* ファイルがカスタム タイプであるかどうかを判断します
*
* @param {String}filename
* @param {String} タイプ、複数のタイプはカンマで区切られます (例: doc、 docx、txt
* @return {Boolean} true または false
* @api public
*/
var is_filetype = exports.is_filetype = function(ファイル名, タイプ) {
types = types.split(',');
var pattern = '.(';
for(var i=0; iif(0 ! = i) {
パターン = '|';
}
パターン = type[i].trim();
パターン = ' )$';
return new RegExp(pattern, 'i').test(filename);

}); == '未定義') {
window.util = {};
return window.util;
} else {
return エクスポート;
})() );


フロントエンド




コードをコピー


コードは次のとおりです:



// ここでは N 行のコードを省略しますif (!util.is_filetype($('#uploadfile').val(), constant.RESUME_FILETYPES)){ can_submit = false; allowed$('#uploadfile').val(' '); alert('アップロードのみ許可: ' constant.RESUME_FILETYPES); } // ここでは N 行のコードが省略されています

バックエンド




コードをコピー


コードは次のとおりです:

var util = require('./public/js/util.js'),
constant = require('./public/js/constant.js');
app.post ('/resume/upload/:job_id', function(req, res, next){
req.form.complete(function(err, フィールド, ファイル){
if(!util.is_filetype(filepath, constant.RESUME_FILETYPES)) {
// クライアントが判断したため、この状況は悪意を持ってアップロードされています。
res.send('ファイル形式エラー: ' ファイルパス
' にファイルをアップロードしてください。 ' constant.RESUME_FILETYPES ' format');
return;
}
// ここでは N 行のコードが省略されています
} );


うわー、もう冗長性はありません!完了
その他の一般的なシナリオ
定数定義
文字列操作などのさまざまな便利なツール モジュール
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。