首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在控制台NodeJs看不到表单数据函数的结果

为什么在控制台NodeJs看不到表单数据函数的结果
EN

Stack Overflow用户
提问于 2019-03-21 04:08:06
回答 2查看 81关注 0票数 0

我正在尝试接收结果字段的值,以便在代码中稍微向下操作它们,但我在console.log中没有定义请解释为什么以及如何在代码中获得字段

代码语言:javascript
复制
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!')
}; 

我知道我需要使用提示,但我不知道如何使用,请给我看你的代码样本

代码语言:javascript
复制
    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!')
};
EN

回答 2

Stack Overflow用户

发布于 2019-03-21 04:25:40

未定义,因为传递到parse方法中的函数是回调函数,并且无法从回调中获取返回。尝尝这个

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-03-21 06:13:46

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

如果在同步事件中调用回调,您可以简单地执行以下操作:

代码语言:javascript
复制
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创建中。

代码语言:javascript
复制
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中)。这是相对较新的,但代码更清晰。

代码语言:javascript
复制
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!');
};

如果省略掉中间的登录,整个结构就可以简化。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55269369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档