为什么在控制台NodeJ中看不到表单数据功能的结果

时间:2019-03-20 20:08:06

标签: javascript node.js

我试图在结果字段中接收值,以便在代码中进行一些下移操作,但在console.log中未定义。请解释为什么以及如何在代码中下入字段

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.log(err, fields, files);
        return fields
    })
console.log('result=>',result)//undefined

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

我了解我需要使用Promise,但是我不知道如何使用,请通过您的代码示例向我展示

    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.log(err, fields, files);
      return new Promise(function(resolve, reject) {
       resolve(fields);

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

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

2 个答案:

答案 0 :(得分:1)

是未定义的,因为在parse方法中传递的函数是回调,并且您无法从回调获得返回。试试这个

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

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

答案 1 :(得分:0)

我对multiparty不熟悉,也不知道所提供的回调是同步还是异步。最短的解决方案仍然是answer of Artur T,只需将所有代码移到回调中即可。但是,如果代码变得更加复杂,这可能不是最佳解决方案。您还应该注意callback hell

如果在同步事务中调用了回调,则只需执行以下操作即可:

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

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

// ...

如果回调是在异步事件中调用的,事情将会变得更加复杂,并且您必须将回调包装到Promise创建中。

var form = new multiparty.Form();

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

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

或者,您可以将函数更改为async函数(这意味着返回值将包装在promise中)。这相对较新,但是代码更简洁。

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.log(err, fields, files);
      resolve(fields);
    });
  });

  console.log('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

// ...

有关arrow functionspromisesasync function的更多说明,请参阅文档。最后一个示例还使用了destructing assignmentspread operator