Почему я не вижу результаты функции данных формы в консоли NodeJs

Я пытаюсь получить значение в полях результатов, чтобы управлять ими немного в коде, но у меня есть undefined в console.info. Пожалуйста, объясните, почему и как я могу получить свои поля в коде.

var multiparty = require('multiparty')

module.exports.login = function(req, res) {
    var form = new multiparty.Form();
 const result = form.parse(req, function(err, fields, files) {
      console.info(err, fields, files);
        return fields
    })
console.info('result=>',result)//undefined

    res.send('Hello from Express!')
}; 

Я понимаю, что мне нужно использовать обещания, но я не знаю, как это сделать, пожалуйста, покажите мне пример вашего кода

    var multiparty = require('multiparty')

module.exports.login = function(req, res) {
    var form = new multiparty.Form();
 var result  = () => { form.parse(req, function(err, fields, files) {
      console.info(err, fields, files);
      return new Promise(function(resolve, reject) {
       resolve(fields);

    })
})}
console.info('result=>',result.resolve)

    res.send('Hello from Express!')
};

Пожалуйста, покажите пример кода, я не могу понять, я новичок в JS

Imediasun 20.03.2019 21:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
86
2

Ответы 2

Не определено, потому что функция, переданная в методе синтаксического анализа, является обратным вызовом, и вы не можете получить возврат от обратного вызова. попробуй это

var multiparty = require('multiparty')
module.exports.login = function(req, res) {
    var form = new multiparty.Form();
    form.parse(req, function(err, fields, files) {
       console.info(err, fields, files);
       console.info('result=>',fields)

       res.send('Hello from Express!')
    })
};

Может быть, я могу поместить переменную полей где-нибудь, чтобы использовать ее после метода синтаксического анализа? Как видите, я пытаюсь использовать обещания, но в моем случае это не дает результатов.

Imediasun 20.03.2019 21:28

в функции обратного вызова синтаксического анализа вызовите другую внешнюю функцию, которая может сохранить данный аргумент из синтаксического анализа. создайте новую функцию и вызовите ее. как сохранить (поля)

Artur T 20.03.2019 21:32

Пожалуйста, покажите код, я не понимаю, что

Imediasun 20.03.2019 21:36

Было бы проще, если бы вы прошли вводный курс по javascript. Асинхронность — это широкая тема, и ее может быть трудно объяснить на этом сайте.

Rash 20.03.2019 21:38

Пожалуйста, покажите, как это можно сделать, это интересно для меня Спасибо По обещанию в обратном вызове

Imediasun 20.03.2019 21:45
"Вы не можете получить возврат от обратного вызова" — Это не совсем так. Значение, возвращаемое функцией обратного вызова, передается функции/методу, принявшему обратный вызов. Таким образом, он может быть возвращен вам через функцию, которая приняла обратный вызов. [1, 2, 3].map(nr => nr + 1) — хороший тому пример. Здесь возвращаемое значение предоставленного обратного вызова возвращается вам для каждого элемента. Это не относится к parse, так как метод всегда возвращает undefined (не имеет возвращаемого значения). В противном случае ответ в порядке.
3limin4t0r 20.03.2019 21:46

Я не знаком с multiparty и не знаю, называется ли предоставленный обратный вызов синхронным или асинхронным. Самым коротким решением по-прежнему является ответ Артура Т, просто перемещающий весь код в обратный вызов. Однако, если код становится более сложным, это может быть не лучшим решением. Вам также следует обратить внимание на ад обратного звонка.

Если обратный вызов вызывается синхронно, вы можете просто сделать следующее:

var result,
    form = new multiparty.Form();

form.parse(req, function(err, fields, files) {
  console.info(err, fields, files);
  result = fields;
  // ^ set the result variable instead of returning
});

// ...

Если обратный вызов вызывается в асинхронном режиме, все становится сложнее, и вам нужно обернуть обратный вызов в создание промиса.

var form = new multiparty.Form();

const result = new Promise(resolve => {
  form.parse(req, function(err, fields, files) {
    console.info(err, fields, files);
    resolve(fields);
    //        ^ resolve the promise with fields as passed value
  });
});

result.then(fields => {
  console.info('result=>', fields);
  res.send('Hello from Express!');
});

В качестве альтернативы вы можете изменить свою функцию на функцию async (это означает, что возвращаемое значение будет заключено в обещание). Что относительно новое, но коды чище.

module.exports.login = async function(req, res) {
  //                     ^ notice the async keyword

  var form = new multiparty.Form();
  const result = await new Promise(resolve => {
    form.parse(req, function(err, fields, files) {
      console.info(err, fields, files);
      resolve(fields);
    });
  });

  console.info('result=>', result);
  res.send('Hello from Express!');
};

Всю структуру можно упростить, если исключить промежуточную регистрацию.

const [err, fields, files] = await new Promise(resolve => 
  form.parse(req, (...args) => resolve(args)));
//                     ^                 ^
// collect all arguments into an array and use that as resolve value

// ...

Дополнительные сведения о стрелочные функции, обещания и асинхронная функция см. в документации. В этом последнем примере также используются удаление присвоения и спред оператор.

Другие вопросы по теме