我正在为表单的字段服务器端之一(expressjs)建立验证,并为此执行以下操作:
从json文件读取数据
从中获取属性(数组)
检查它是否包含用户生成的数组的每个元素,仅此而已,例如:
[1,2,3,4,5]; (json array)
[1,2,3,4,5,6] (user generated array) //must return false
[1,2,3,4,5];
[1,3,4] //must return true;
[1,2,3,4,5];
[1,2,7] //must return false;
所以我为此使用了这段代码:
const contains = (arr1, arr2) => {
arr2.every(v => arr1.indexOf(v) !== -1)
}
var match;
fs.readFile('../tags.json', 'utf8', (err, data)=>{
var JsonData = JSON.parse(data);
var tagsArray = JsonData.tags;
console.log(tagsArray)
console.log(tags)
if(tagsArray instanceof Array){
console.log('tagsArray is array')
}
if(!contains(tagsArray, tags)){
match = false
}
else{
match = true
}
console.log(match + ' blah1')
});
console.log(match + ' blah2')
if(match == false){
return res.status(409).send({
message: 'Do not provide your own tags'
});
}
但是它总是在fs.readFile
块内返回false,因为它在fs.readFile
块外返回undefined,所以这意味着包含返回undefined的函数(我已经对其进行了测试)
那么这是什么线索呢? 谢谢!
答案 0 :(得分:1)
fs.readFile
是异步的,因此任何取决于其结果(正在读取的文件)的代码都必须放在回调函数中。 (回调函数是(err, data) => { ... }
部分。)
将console.log(match + 'blah2')
和if(match == false) { ... }
部分移到回调内部(在blah1行之后)。
您还可以查看async或使用fs.readFileSync,这样可以避免使用回调函数。
另一方面,您需要确保始终到达res.send()
行,即在您的情况下为match == true
。否则,当match为true时,您的http请求将不会返回。
编辑:
这是用于表达的一个非常基本的结构,主要是伪代码和注释,仅用于说明回调:
app.post('/tags', (req, res) => {
// your setup code here
fs.readFile('../tags.json', 'utf8', (err, data) => {
console.log('readFile has finished')
// now you have heard back from readFile
// check the err and send 500 if there was a problem
// otherwise work with the file in the var data
// any other db-related stuff also goes in here, which probably
// has its own callback you need to use
db.save(data, (err) => {
// db call is done, potentially with an error
// Here you can use `res` to send http response
})
// !! again here the db is still doing its work
})
// !! anything you add here will be executed before readFile is done
console.log('readFile is probably still at work')
})
我还应该指出,您希望contains
返回布尔值,即return arr2.every(...)
答案 1 :(得分:0)
您可以使用 async / await :
C(Allocator& A) {
ptr = new (A.Allocate(10 * sizeof(int))) int[10];
need_cleanup = false;
}