在函数内部定义外部范围变量

时间:2019-05-18 16:02:33

标签: javascript arrays node.js json express

我正在为表单的字段服务器端之一(expressjs)建立验证,并为此执行以下操作:

  1. 从json文件读取数据

  2. 从中获取属性(数组)

  3. 检查它是否包含用户生成的数组的每个元素,仅此而已,例如:

[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的函数(我已经对其进行了测试)

那么这是什么线索呢? 谢谢!

2 个答案:

答案 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;
}