# زبان های اسکریپتی > JavaScript و Framework های مبتنی بر آن > Node.js >  چک کردن فیلد ها قبل از آپلود فایل در multer

## kianajoo

درود
من با angularjs و node.js  و multer میخوام یه فرم رو که چند تا فیلد تکست و یه فایل هست رو به سرور نود ارسال کنم و تویه سرور چک کنم که مقدار فیلدهای تکست اگه خالی بود فایل آپلود نشه...
ولی توی multer اول فایل رو آپلود میکنه بعد تازه میشه تکست فیلدهارو چک کرد!!!!

$scope.submit = function(){ //function to call on form submit
if ($scope.add_news.file.$valid && $scope.file) { //check if from is valid
$scope.upload($scope.file); //call upload function
}else{
$scope.upload(null);
}
}

$scope.upload = function (file) {
if($scope.news !="" && num_object($scope.news,3) ){


Upload.upload({
url: '/form_edit_news', //webAPI exposed to upload the file
data:{file:file,myDate:$scope.news} //pass file as data, should be user ng-model
}).then(function (resp) { //upload function returns a promise
console.log(resp);
if(resp.data.status){ //validate success
$scope.message = resp.data.msg;
} else {
$scope.message = resp.data.msg;
}
}, function (resp) { //catch error
console.log('Error status: ' + resp.status);
}, function (evt) { 
var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
$scope.progress = 'progress: ' + progressPercentage + '% '; // capture upload progress
});



}else{

$scope.message = 'لطفا همه گزینه ها را وارد کنید!!!';
} 

};
و سمت سرور 



var storage = multer.diskStorage({ //multers disk storage settings
destination: function (req, file, cb) {
cb(null, __dirname + '/static/uploads/');
},
filename: function (req, file, cb) { 
var datetimestamp = Date.now();
cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1]);
}
});

var upload = multer({ //multer settings
storage: storage,
limits: {
fileSize: 256 * 1024 * 1024
},
fileFilter: function(req, file, cb) {
if(file.mimetype == 'image/jpeg'){
cb(null, true);
}else{
cb(null, false);
}
}
}).single('file');
app.post('/form_edit_news', upload.single('file'), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
  //اینجا اول فایل آپلود میشه...
//اینجا چطوری اول فیلدهامو چک کنم قبل از آپلود؟؟؟؟؟!!! 
});

----------


## Patira

به نظر من قبل از اینکه تنظیمات Multer رو بنویسید، یه متد داشته باشید که چک کردن فیلد رو انجام بده، مثل این:

checkField: function(req, res, next) {   //Check your fields in here!
},


بعد Router اینطوری میشه:

app.post('/form_edit_news', upload.single('file'), upload.checkField, function(req, res){});

----------


## kianajoo

تشکر دوست عزیز...
قبلا توی جستجوهام به این روش رسیده بودم 
http://stackoverflow.com/questions/2...re-file-upload
ولی نمیدونم checkField رو گجا باید بنویسم!!!

----------


## Patira

گفتم دیگه، شما checkField رو قبل از خط 11 سمت سرور بنویسید مثلاً. ولی خب نهایتاً باید توی دستور Router، بعد از آرگومان مربوط به آپلود، آرگومان checkField رو (همونطور که براتون نوشتم) انجام بدین.

----------


## kianajoo

بازم تشکر....
منم الان دقیقا مشکلم اینجاست!!
که نمیتونم checkfiel رو بنویسم!
کل نت رو شخم زدم چیزی پیدا نکردم...نمونه کدی هم ندیدم...
یعنی هیچ کس تویه دنیا تا حالا نخواسته قبل از آپلود فایل فیلدهای دیگشو چک کنه؟!!!!!!!!! :متفکر:  :متفکر:  :گیج:  :گیج:  :افسرده:  :اشتباه:

----------


## Patira

امیدوارم منظورتون رو درست متوجه شده باشم؛ چون راه برای اعتبارسنجی (خصوصاً اعتبارسنجی ساده ای که شما نیاز دارید) خیلی خیلی زیاده.

اگه این اعتبارسنجی رو نیاز دارید که به صورت Client-Side انجام بدین، که خب Angular هست و ngMessage هاش که کارو فوق العاده راحت کرده. اگه خواستید این رو بهتون میگم چطوری انجام بدین (گمان می کنم خودتون بلد باشید).

اما اگه نیاز دارید که اعتبارسنجی Server-Side باشه (که فکر می کنم چنین چیزی مدنظرتون هست)، مجدداً راه های زیادی هست:

1. بسته به شکلی که فرم رو نوشته باشید، میتونید ماژول jQuery رو برای پروژۀ Node نصب کنید و به راحتی در محیط Server-Side بحث Validation رو با کدهای jQuery انجام بدین (اگه خواستین در این مورد توضیحات بیشتر میدم).

2. ماژول Validate.js هست که مخصوص این کار هست: http://validatejs.org/

3. یه راه اساسی تر وجود داره که فکر می کنم مناسب تر کار شما باشه؛ مفصلاً اینجا در موردش توضیحات داده شده: http://www.sitepoint.com/creating-an...ms-in-node-js/ (اگه جاییش رو متوجه نشدید، بگید تا توضیح بدم در موردش)

4. یه مقالۀ خوب دیگه هم هست که چون دارید از Angular و Express استفاده می کنید، میتونید مطالعه ش کنید: https://thecodebarbarian.wordpress.c...ing-angularjs/
به نظرم پاسختون به قطع یقین باید دیگه داخل این یکی مقاله باشه. این رو هم اگه خواستید براتون توضیح میدم، گرچه سبک قدیمی ای داره، ولی ساده و مطمئن هست و من برای اولین پروژه م که با Node و Angular می نوشتم ازش استفاده کردم، ولی خب الان با وجود این همه ماژولی که برای Node نوشته شده، دیگه لازم نمی بینم از این روش استفاده کنم.

- اگه بحث آپلود رو نداشتید هم که خیلی راحت میشد از Callback مربوط به Route اعتبارسنجی رو انجام بدین. (این رو هم اگه خواستید براتون توضیح میدم - ولی گمان می کنم خودتون بدونید و خب راه حلی هم برای شما به حساب نمیاد. فقط گفتم که این مورد رو هم آورده باشم داخل راه حل ها :دی)

پ.ن: از خود Express هم تا حدودی میشه برای Validation های این شکلی استفاده کرد. ولی به درد کار شما نمیخوره. یعنی بعید میدونم که بشه ازش قبل از دستور app.post اعتبارسنجی رو بگیریم. معمولاً از Callback این دستور، از آرگومان Request میشه اعتبارسنجی رو روی elements فرم انجام داد که همونطور که گفتم به درد کار شما نمیخوره.

----------


## kianajoo

درود...
درست متوجه شدین...اعتبار سنجی سمت سرور...
والا من تازه کارم و از این لینکهایی که زحمت کشیدی و دادی چیزی سر در نیاوردم!!!
من از این آموزش برای آپلود فایل استفاده کردم 
http://code.ciphertrick.com/2015/12/...js-and-nodejs/
و فقط یه مقدار دیگه به فیلد فایل اضافه کردم
data:{file:file,myDate:$scope.news} //pass file as data, should be user ng-model
فقط میخوام ببینم که myDate من خالی نباشه همین...(value مهم نیست که چی باشه...)
اگه خالی نبود اون وقت فایل آپلود بشه... :ناراحت:

----------


## Patira

میخواید این اعتبارسنجی با کاربر هم Interaction (تعامل) داشته باشه؟ یعنی به کاربر پیامی هم داده بشه یا خیر؟

چون اگه فقط میخواید این اعتبارسنجی رو داخل سرور انجام بدین، که خیلی راحت میتونید صحیح بودن $scope.news رو بررسی کنید؛ یعنی به این شکل:

if($scope.news) {    myData:$scope.news} else {    console.log("ERROR");}

یا نمونۀ کوتاهش:

$scope.news ? myData:$scope.news : '//EMPTY VALUE';

در این حالت اگه مقدار $scope.news یکی از این حالات باشه، مقدار برگشتی False خواهد بود:

- Null، Undefined، NaN، 0، false و رشتۀ خالی

یا میتونید کد رو تغییر ندید، و مثلاً داخل همون متد checkField که در قسمت های قبلی در موردش صحبت کردیم، این بررسی رو به این شکل انجام بدین:

checkField: function(req, res, next) {
    if(data.myData.length == 0) {        // ERROR FOR NOT ENTERING ANY VALUE    }
},

اگه جواب نگرفتید، بهم بگید تا بازم بهتون راه حل بگم. چون همونطور که گفتم برای این کار بی نهایت راه حل هست :)

پ.ن: این مواردی که گفتم هم به شکلی هستند که قبل از آپلود بررسی رو انجام میدن. در حالت اول، وقتی داده داره داخل اون Property ذخیره میشه، چک کردن رو هم انجام میده؛ بنابراین قبل از آپلود هست. حالت دوم هم که در موردش صحبت کرده بودیم. شما این اعتبارسنجی رو با اون متد انجام میدین، بعد هم این متد رو به همون شکلی که خدمتتون در پاسخ های قبلی گفته بودم داخل دستور مربوط به Route میارید.

----------

