从节点js中读取的JSON获取并检查值[已解决]

问题描述 投票:0回答:1

我正在尝试检查用户是否存在(在json文件上注册)。

不幸的是,我在所有Stack Overflow中都找不到一个有效的解决方案,该解决方案在回调函数中给了我一个简单的“ true”。

最接近解决方案的版本


实验V1:

let userExist;
function check(){
  console.log("CHECK!");
  return userExist = true;
}
// check(); if this, return true... obvious.


//// check if user exist

server.readFileSync(filepath, 'utf8', (err, data) =>
{

  let json = JSON.parse(data),
      userlist = json.allusers;

  for (let key in userlist)
  {

    if ( userlist[key].email == req.body.user_email ) 
    {
      console.log("FINDED EQUAL");
      check(); // return undefined ???
    }

  }

});

console.log("userExist value : "+userExist);

也出现了不同形式的调试,但是“ true”永不返回。

注意:是,正确读取了JSON。如果读取文件中的所有内容均正常运行,您会立即注意到相同的电子邮件。

output: "undefined"
Log: total bypassed


实验V2:

在这种情况下(带有异步读取),它返回所有调试信息(但“ true”仍未定义)

异步的问题是我必须等待它检查才能继续使用其他功能。

  //// check if user exist

server.readFile(filepath, 'utf8', (err, data) =>
{

  let json = JSON.parse(data),
      userlist = json.allusers;

  for (let key in userlist)
  {

    if (/* json.allusers.hasOwnProperty(key) &&*/  userlist[key].email == req.body.user_email ) 
    {
      console.log("FINDED EQUAL");
      check();
    }

  }

});

var userExist;
function check(userExist){
  console.log("CHECK!");
  return userExist=true;
}

console.log("userExist value : "+userExist+"");
server listening on: 8080
userExist value : undefined
CHECK!
FINDED EQUAL


实验V3:

在各种建议之后,我通过使用异步函数的语法来妥协。

这允许到达有序的代码,但是尽管如此,仍无法等待结果并将其导出到同一函数之外(这是因为节点本身是异步的!因此它已经进行了!)

使用“消息”变量检查它是否可以返回我这样做的对象:

//simple output tester
var message;

// create a promise
let loopusers = new Promise( (resolve)=>{

  server.readFile( filepath, 'utf8', 
  (err, data) => {

      let json = JSON.parse(data),
          userlist = json.allusers,
          findedequal;

      console.log("CHECK USERS IN DB...for "+userlist.length+" elements");

      // loop all items
      for (let key in userlist)
      {

        console.log("Analyzed key ::: "+key);
        if ( userlist[key].email == req.body.user_email ) 
        {

          console.log("CHECK : user isn't free");
          findedequal=true;
          resolve(true); // return the result of promise
        }

        else if(key >= userlist.length-1 && !findedequal )
        {
          console.log("CHECK : User is free ;)");
          resolve(false); // return the result of promise
        }

      }

      // call the action
      createuser();

    });


});

// when promise finished --> start action
async function createuser(message)
{

  let userExist = await loopusers;
  console.log("userExist: "+userExist);

  if(userExist)
  {
      message = { Server: "This user already exists, Try new e-mail..."};
  }

  else
  {
      message = { Server: "Registration user -> completed..."}; 
  }

  // return values
  return message;

};

也可以通过“ then”使用经典语法。例如:

//simple output tester
var message;

// create a promise
let loopusers = new Promise( (resolve)=>{
    ...
});

loopusers.then( (response)=>{
  ...
}) 

然后我意识到,通过直接从最初的函数中调用函数,可以很容易地简化甚至更多:

    var message;

// create a promise --> check json items
server.readFile( filepath, 'utf8', 
(err, data) => {

    let json = JSON.parse(data),
        userlist = json.allusers,
        findedequal;

    console.log("CHECK USERS IN DB...for "+userlist.length+" elements");

    for (let key in userlist)
    {

      console.log("Analyzed key ::: "+key);
      if ( userlist[key].email == req.body.user_email ) 
      {

        console.log("CHECK : user isn't free");
        findedequal=true;
        createuser(true); // call direct function whit params true

      }

      else if(key >= userlist.length-1 && !findedequal )
      {
        console.log("CHECK : User is free ;)");
        createuser(false); // call direct function whit params false

      }

    }

  });


// start action
function createuser(userExist) 
{

  if(userExist)
  {
      message = { Server: "This user already exists, Try new e-mail..."};
  }

  else
  {
      message = { Server: "Registration user -> completed!"}; 
  }

  // return values
  return message;

};

进行调试并编写

消息在aSync功能外部丢失

实验V4决赛! :

最后,经过多次尝试,解决方案! (是的,但是知道它不是异步的)

如果我们分配一个变量,则整个模型的读取将变得同步,然后我们返回简单的模型。

    let message,
        file = server.readFileSync(filepath, 'utf8'), // read sync
        json = JSON.parse(file),  // now parse file
        userlist = json.allusers,   // get your target container object
        userExist,
        findedequal;

   console.log("CHECK USERS IN DB...for "+userlist.length+" elements");

   for (let key in userlist)
   {

      console.log("Analyzed key ::: "+key);
      if ( userlist[key].email == req.body.user_email ) 
      {

          console.log("CHECK : finded equal value on key ["+key+"] - user isn't free");
          findedequal=true;
          userExist = true;

      }

      else if(key >= userlist.length-1 && !findedequal )
      {
          console.log("CHECK : User is free ;)");
          userExist = false;

      }

   }

   if(userExist)
   {
          console.log("└ EXIT TO CHECK --> Can't create user, function stop.");
          message = { Server: "This user already exists, Try new e-mail..."};
   }

   else
   {

          console.log("└ Exit to check --> New user registration ...");
          message = { Server: "Registration user -> completed!"}; 

   }

}

return message;

现在:

It's all sync and all log is perfect
all var is checked
all return... return


**最终结论:**

是否可以在节点中检索ASync变量?据目前为止我所了解的……不。

Node本质上是异步的,因此,要恢复的信息没有被保存,然后从数据库中恢复是要做的事情,如果像本文中那样使用它,则无法恢复。

但是...如果目的是使文件同步读取,则答案比预期的要简单。


特别感谢:Barmar;奥斯汀·利希利(Austin Leehealey);戈切夫

javascript node.js callback readfile
1个回答
1
投票

问题是您正在调用console.log(“ userExist值:” + userExist +“”);太早了。在您呼叫该行时,尚未定义userExist。这是因为server.readFile()函数需要一个回调,并且一旦读取文件,该回调函数就会执行。但是,读取文件通常会花费一些时间,因此程序会继续运行。它执行console.log(“ userExist value:” + userExist +“”);然后返回到回调函数,并将userExist定义为true。

如果您想了解有关回调的更多信息,请查看下面的链接。回调是Node.js的定义功能,了解回调对任何Node网站都是必不可少的。

https://medium.com/better-programming/callbacks-in-node-js-how-why-when-ac293f0403ca

尝试这样的事情。

let userExist;
function check(){
  console.log("CHECK!");
  return userExist = true;
}
// check(); if this, return true... obvious.


//// check if user exist

server.readFileSync(filepath, 'utf8', (err, data) =>
{

  let json = JSON.parse(data),
      userlist = json.allusers;

  for (let key in userlist)
  {

    if ( userlist[key].email == req.body.user_email ) 
    {
      console.log("FINDED EQUAL");
      check(); // return undefined ???
      console.log("userExist value : "+userExist);
    }

  }

});
© www.soinside.com 2019 - 2024. All rights reserved.