我试图在结果字段中接收值,以便在代码中进行一些下移操作,但在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!')
};
答案 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 functions,promises和async function的更多说明,请参阅文档。最后一个示例还使用了destructing assignment和spread operator。