2015-07-30 7 views
0

Я использую экспресс и уловка. В следующем случае файлы находятся в произвольном порядке. Порядок файлов важен для этого конкретного запроса. Как я могу получить первоначальный заказ от запроса? Все, что мне нужно, это массив исходных имен.Как я могу получить исходный порядок файлов в запросе?

/* POST Put user items. */ 
router.post('/put', upload.array('useritem'), function (req, res, next) { 
    // req.files is always in a different order. 
}); 
+0

Вы уверены, запрос имеет порядок вы ожидаете? (Для этого используйте сетевой монитор - например, wirehark). При использовании промежуточного программного обеспечения 'array' файлы вставляются в массив в порядке их анализа. Не должно быть причины, чтобы это было иначе, чем порядок в запросе – Amit

+0

Я использовал Fiddler 2. Запрос всегда в том же порядке. Когда я получаю его от мультера, он находится в случайном порядке. Я хочу получить первоначальный заказ от самого запроса, чтобы я мог сортировать эти файлы соответствующим образом. – Jordan

+0

Я не могу воспроизвести это, я всегда получаю файлы в том порядке, в котором они загружаются (что имеет смысл, как и @Amit говорит, файлы вставляются в массив в порядке их разбора). Есть ли у вас какое-либо другое промежуточное ПО, которое может быть причиной этого? Вы пытались создать [mcve] (https://stackoverflow.com/help/mcve)? – robertklep

ответ

-3

Node не гарантирует порядок индексов массивов. См. Этот вопрос для получения дополнительной информации: Nodejs Order of properties guarantee

Как указано, мое заявление выше неверно. Правильным утверждением было бы то, что вы не должны передавать по заказу свойства в объект, если вы использовали JSON.stringify() для преобразования объекта в JSON, а затем отправили его как полезную нагрузку запроса.

Хотя мое первоначальное заявление, по-видимому, неверно, это - проблема - проблема, с которой я столкнулся, - где значения массива отображаются на неправильном заказе на моем сервере, - и я решил это, как показано ниже. Источником проблемы может служить предложение Амита в комментариях выше. В частности, это ваш javascript на стороне клиента, который изначально не вводит файлы в том порядке, который вы ожидаете.

Независимо от причины вам придется выполнить некоторую работу на стороне клиента, чтобы добавить «искусственный» индекс в каждый файл, а затем передать их как массив объектов.

Таким образом, вместо этого:

var files = ['file1.jpg','file2.jpg','file3.jpg']; 

Вам нужно передать объект в ваш бэкэнд так:

var files = [ 
    { index : 0, file : 'file1.jpg' }, 
    { index : 1, file : 'file2.jpg' }, 
    { index : 2, file : 'file3.jpg' }, 
]; 

И тогда вам нужно отсортировать массив объектов сразу он получил по экземпляру бэкэнд, так как:

files.sort(function(a, b) { 
    return a.index - b.index; 
}); 

И тогда вы можете петлю через files массив и делать то, что вы:

var justFiles = []; 

async.each(files, function(file, iterate){ 
    justFiles.push(file.file); 
    return iterate(); 
}, function(result){ 
    console.log(justFiles); 
}); 

И выход был бы:

'file1.jpg','file2.jpg','file3.jpg' 
+1

ЧТО ???!?!? нет гарантии для индексного порядка массивов?! ??! – Amit

+0

О чем ты говоришь? сортировка? 'parseFloat' для числа? Хотел бы я, чтобы я мог 2 – Amit

+0

Успокойся.Это всего лишь массив. – AJB