我正在尝试接收结果字段的值,以便在代码中稍微向下操作它们,但我在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!')
}; 我知道我需要使用提示,但我不知道如何使用,请给我看你的代码样本
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!')
};发布于 2019-03-21 04:25:40
未定义,因为传递到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!')
})
};发布于 2019-03-21 06:13:46
我不熟悉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。
https://stackoverflow.com/questions/55269369
复制相似问题