#javascript #node.js #module
#javascript #node.js #модуль
Вопрос:
Этот код работает нормально, если он запущен в этом вопросе:
app.route('/upload').post(rulesUpload.upload(obj),function (request, response, next) {
response.status(200).end('File Caricato/i Con Successo');
});
и нет, если я напишу:
app.route('/upload').post(function(request, response, next) {
rulesUpload.upload(obj);
response.status(200).end('File Caricato/i Con Successo');
});
var formidable = require('formidable'),
util = require('util'),
fs = require('fs-extra');
var defaultMaxSize = 3;
var defaultMaxFiles = 1;
exports.upload = function(obj) {
return function(req, res, cb) {
var check = '';
var errors = {};
for (key in req.files) {
if ((obj.required != undefined amp;amp; req.files[key].size == 0) amp;amp; (obj.required[key] != undefined amp;amp; obj.required[key]))
check = "Il file " key " è obbligatorio!";
else if (obj.destination[key] == undefined)
check = 'Il file ' key ' non è gestito correttamente.';
else if (obj.files[key] != undefined amp;amp; obj.files[key] < req.files[key].length)
check = 'Non si possono inserire più di ' obj.files[key] ' file per il campo ' key;
else if (obj.files[key] == undefined amp;amp; defaultMaxFiles < req.files[key].length)
check = 'Non si possono inserire più di ' defaultMaxFiles ' file per il campo ' key;
else {
var new_location = obj.destination[key] '/';
var numFiles = 1;
if (req.files[key].length != undefined)
numFiles = req.files[key].length;
if (numFiles == 1)
req.files[key] = {
0: req.files[key]
};
for (var i = 0; i < numFiles; i ) {
var file_name = '';
if (obj.filename[key] != undefined) {
file_name = obj.filename[key].name;
if (file_name == undefined)
file_name = req.files[key][i].name.substring(0, req.files[key][i].name.lastIndexOf("."));
if (obj.filename[key].prefix != undefined)
file_name = obj.filename[key].prefix file_name;
if (obj.filename[key].suffix != undefined)
file_name = obj.filename[key].suffix;
file_name = req.files[key][i].name.substring(req.files[key][i].name.lastIndexOf('.'), req.files[key][i].name.length);
} else file_name = req.files[key][i].name;
if (obj.fileTypes[key] != undefined) {
var re = new RegExp(obj.fileTypes[key]);
var mimetype = re.test(req.files[key][i].type);
var extname = re.test(req.files[key][i].name.toLowerCase());
if (!mimetype amp;amp; !extname)
check = "Sono Accettate solo le seguenti estensioni: " obj.fileTypes[key] " per il campo " key;
}
if (obj.fileSize[key] != undefined amp;amp; req.files[key][i].size > obj.fileSize[key] * 1024 * 1024)
check = 'I file ' key ' non possono superare i ' obj.fileSize[key] " MB";
if (obj.fileSize[key] == undefined amp;amp; req.files[key][i].size > defaultMaxSize * 1024 * 1024)
check = 'I file ' key ' non possono superare di default i ' defaultMaxSize " MB";
if (check == '') {
var temp_path = req.files[key][i].path;
fs.move(temp_path, new_location file_name, function (err) {
if (err) { }
else { }
});
} else {
errors[key] = check;
}
if (check != "")
errors[key] = check;
}
if (check != "")
errors[key] = check;
}
if (check != "")
errors[key] = check;
check = '';
}
if (check != "")
errors[key] = check;
check = '';
if (errors != {})
return cb(util.inspect(errors));
else return cb(null);
};
return;
};
P.S.: Для суперпользователей я знаю, что на этапе возврата есть ошибка, но я не нашел никакого решения, и это вторичная проблема.
P.S.2: Для любопытных, я использую этот код для проверки, могут ли отправленные файлы быть загружены или нет.
Комментарии:
1. Ваш метод возвращает функцию, поэтому было бы
rulesUpload.upload(obj)(request, response, next);
Ответ №1:
Потому что вам нужно писать асинхронный код с помощью nodejs .. промежуточное программное обеспечение принимает запрос, ответ и обратный вызов, а после завершения работы передает его следующему промежуточному программному обеспечению…
Прочитайте, что возвращает функция загрузки, она возвращает функцию, которая является промежуточным программным обеспечением..
app.route('/upload').post(middleware1, middleware2, ..., callback)
поэтому, если вы хотите напрямую обрабатывать загрузку в своем обратном вызове, вы должны вызвать его, а затем передать ему другую функцию.
app.route('/upload').post(function (request, response, next) {
rulesUpload.upload(obj)(request, response, function(err) {
if (!err) {
return response.status(200).end('File Caricato/i Con Successo');
} else {
// do something with the err..
}
});
});
Так что эти коды становятся все более сложными.. так что используйте промежуточное программное обеспечение)
Комментарии:
1. Я знаю, что это сложнее, но иногда это не работает, потому что я должен передать переменную из функции в другую! Однако спасибо!
2. Однако ваш код возвращает, что ответ не определен! Почему?
3. не уверен, что вы имеете в виду, вы все равно должны использовать подход промежуточного программного обеспечения. приведенный выше код не тестировался, просто чтобы дать вам представление об асинхронном стиле nodejs и промежуточного программного обеспечения
4. Ну, я должен вставить строку в свою базу данных, а затем передать переменную (идентификатор) в функцию загрузки… Если я правильно понимаю, если я сделал что-то вроде .post(createNewUser(),upload()) node.js попробуйте выполнить эти методы одновременно, чтобы у меня это не сработало…
Ответ №2:
Потому что вы вызываете upload как функцию синхронизации, но она асинхронна из-за fs.move . Кроме того, ваш вызов возвращает функцию. Просто передайте обратный вызов вашей функции и вызовите ее следующим образом :
rulesUpload.upload(obj, function(){
response.status(200).end('File Caricato/i Con Successo');
})
И измените прототип на :
exports.upload = function(obj, cb) {
// return function(req, res, cb) { // REMOVE THIS LINE
Комментарии:
1. Существует проблема … сначала приложение возвращает то, что не находит запрос, затем, после того, как я добавил запрос между параметрами в модуль, возвращает, что cb не является функцией
2. я не видел, чтобы вы использовали req, поэтому замените prototype на exports.upload = function(req, res, obj, cb) и вызовите его с помощью exports.upload(req, res, obj, function(){ Но что такое job ?? кажется, это никогда не было определено
3. Я использовал этот модуль также для управления созданием нового пользователя, поэтому он должен вызываться после создания строки в базе данных …