gpt4 book ai didi

node.js - 开始使用 Promise

转载 作者:太空宇宙 更新时间:2023-11-03 22:07:30 24 4
gpt4 key购买 nike

我开始使用 promise ,但是,我不太理解这一点,你能帮我解决这个问题吗?我正在验证通过应用程序发送的所有数据,但仍然加载到带扣中,我不明白为什么。

这是我的代码(现在我只是验证 POST 方法,但我只是用它进行测试)。

var parse = require('querystring')

/*
check the regular expression of the final value
(not special characters accepted)
*/
var dev = function (data) {
var err = '';
if (data === undefined || data == null || data.length <= 0) {

err += 1;
} else {
if (/[=;(){}/[>'"<]/.test(data)) {
console.log("special char or invalid data ")
console.log(data)
err += 1;

} else {



}
}
return err < 1 ? data : err
}

/*
Verify the type of the value or variable
(recursive functionality)
*/
var verify = function (data) {
if (Array.isArray(data)) {
console.log('array ')
data.forEach(element => {
// console.log(element)
verify(element)
new Promise(function (resolve, reject) {
verify(element, function (err, element) {
if (err) {
reject(err);
} else {
resolve(element);
}
});
})
});
} else if (typeof (data) == 'object') {
//Convert the object on Array to pass this itself to check (recursively)
console.log('is an object')
// console.log(data)
newdata = Object.values(data)
new Promise(function (resolve, reject) {
verify(newdata, function (err, newdata) {
if (err) {
reject(err);
} else {
resolve(newdata);
}
});
})
} else if (typeof (data) == 'function') {
console.log('is a function')
// verify(data())
new Promise(function (resolve, reject) {
verify(data(), function (err, pipe) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
})
} else {
// console.log('last level of data')
return new Promise(function(resolve, reject){
dev(data, function(err, data){
if(err){
reject(err);
} else {
resolve(data)
}
})
})
// dev(data)
}
// return err < 1 ? data : err;
}




/*
Check the method of the request and based on this pass the path on req to verify
(req.body or req.params-req.query)
*/
var controlencoder = function (req, res, next) {

//Print method on console
console.log(req.method)

//check the method
if (req.method == 'PUT' || req.method == 'POST') {
let body = '';
let pipe = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
pipe = parse.parse(body)
console.log(pipe)
return new Promise(function (resolve, reject) {
verify(pipe, function (err) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
}).then(next())

});
} else {
var pipe = req.params
return new Promise(function (resolve, reject) {
verify(pipe, function (err) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
}).then(next())
// console.log(pipe)
}
// var pipe = [req.body, req.params]

}

module.exports = controlencoder;

最佳答案

在您调用 verify() 的所有地方和dev()您使用两个参数调用它,但这两个函数只接受一个参数。所以他们只会忽略你传入的函数。

现在 promise 的重点是摆脱这些回调,所以我猜你已经完成了这个过程的一半。因此,让我们让它们全部返回 Promise,并且只接受一个参数。

让我们回顾一下代码:

dev(数据)

var dev = function (data) {
var err = '';
if (data === undefined || data == null || data.length <= 0) {

err += 1;
} else {
if (/[=;(){}/[>'"<]/.test(data)) {
console.log("special char or invalid data ")
console.log(data)
err += 1;

} else {

}
}
return err < 1 ? data : err
}
  1. err初始化为字符串,然后在出现问题时将数字添加到其中,最后将其与数字进行比较。它恰好有效,但您也许应该一直使用数字,即声明它 var err = 0; .
  2. 您的正则表达式/[=;(){}/[>'"<]/逃逸得很厉害,需要放一个\/前面位于中间,否则终止正则表达式。最终结果:/[=;(){}\/[>'"<]/ .
  3. 更改返回值以始终返回 promise :return err < 1 ? Promise.resolve(data) : Promise.reject(err);

验证(数据)

var verify = function (data) {
if (Array.isArray(data)) {
console.log('array ')
data.forEach(element => {
// console.log(element)
verify(element)
new Promise(function (resolve, reject) {
verify(element, function (err, element) {
if (err) {
reject(err);
} else {
resolve(element);
}
});
})
});
  1. 由于 verify() 已经返回了一个 Promise,所以我们不需要在这里创建任何额外的 Promise 对象。让我们放弃整个new Promise(..){...}事情,只需调用 verify() .
  2. 我们需要验证此处的所有元素并确保所有元素都正常。使用.map()而不是.forEach()我们可以收集verify()的返回值调用,然后生成 Promise 的数组对象。然后我们可以合并Promise的数组使用 Promise.all() 的对象功能。让我们将代码更新为:

 

var verify = function (data) {
if (Array.isArray(data)) {
console.log('array ');
return Promise.all(
data.map(element => {
// console.log(element)
return verify(element);
}));
});

现在数组中的所有项目都映射到所有 verify() 的 Promise 结果数组中来电,以及Promise.all()将它们合并在一起,这样即使一个验证失败,返回的 Promise 也会失败。

    } else if (typeof (data) == 'object') {
//Convert the object on Array to pass this itself to check (recursively)
console.log('is an object')
// console.log(data)
newdata = Object.values(data)
new Promise(function (resolve, reject) {
verify(newdata, function (err, newdata) {
if (err) {
reject(err);
} else {
resolve(newdata);
}
});
})
  1. 此处也有类似的更改。当 verify 已返回 Promise 时,无需创建新的 Promise 对象。让我们更新为:

    } else if (typeof (data) == 'object') {
    //Convert the object on Array to pass this itself to check (recursively)
    console.log('is an object');
    // console.log(data);
    newdata = Object.values(data);
    return verify(newdata);

此处进行相同的更改:

    } else if (typeof (data) == 'function') {
console.log('is a function')
// verify(data())
new Promise(function (resolve, reject) {
verify(data(), function (err, pipe) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
})

更改为:

    } else if (typeof (data) == 'function') {
console.log('is a function');
return verify(data());

最后:

    } else {
// console.log('last level of data')
return new Promise(function(resolve, reject){
dev(data, function(err, data){
if(err){
reject(err);
} else {
resolve(data)
}
})
})
// dev(data)
}
// return err < 1 ? data : err;
}

更改为(因为 dev() 也返回 Promise ):

    } else {
// console.log('last level of data')
return dev(data);
}
// return err < 1 ? data : err;
}

controlencoder(req, res, next)

var controlencoder = function (req, res, next) {

//Print method on console
console.log(req.method)

//check the method
if (req.method == 'PUT' || req.method == 'POST') {
let body = '';
let pipe = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
pipe = parse.parse(body)
console.log(pipe)
return new Promise(function (resolve, reject) {
verify(pipe, function (err) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
}).then(next())

});

将其更改为:

var controlencoder = function (req, res, next) {

//Print method on console
console.log(req.method)

//check the method
if (req.method == 'PUT' || req.method == 'POST') {
let body = '';
let pipe = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
pipe = parse.parse(body)
console.log(pipe)
return verify(pipe).then(next());
});

还有这个:

    } else {
var pipe = req.params
return new Promise(function (resolve, reject) {
verify(pipe, function (err) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
}).then(next())
// console.log(pipe)
}
// var pipe = [req.body, req.params]
}

..对此:

    } else {
var pipe = req.params

return verify(pipe).then(next());
// console.log(pipe)
}
// var pipe = [req.body, req.params]
}

希望它有效:)

关于node.js - 开始使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51491204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com