gpt4 book ai didi

javascript - 获取并检查 NodeJS 中读取的 JSON 值

转载 作者:行者123 更新时间:2023-12-02 22:13:31 24 4
gpt4 key购买 nike

我正在尝试检查用户是否存在(在 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:

在提出各种建议之后,我通过使用异步函数的语法达成了妥协。

这允许到达有序代码,但尽管如此,还是不​​可能等待结果并将它们导出到同一函数中(这是因为 Node 本身是异步的!因此它已经继续了!)

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

//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;

};

debugging is taken and written

the message is lost outside the aSync function

 

实验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

 

<小时/>

 

** 最终结论:**

是否可以在 Node 中检索异步变量?据我所知到目前为止...没有。

Node 本质上是异步的,因此恢复未保存然后从数据库中恢复的信息会被留在要做的事情中,如果您像本文中那样使用它,就会变得不可恢复。

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

<小时/>

特别感谢:Barmar;奥斯汀·李希利; C.戈切夫;

最佳答案

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

如果您想了解有关回调的更多信息,请查看下面的链接。回调是 Nodejs 的一个定义特性,理解它们对于任何 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);
}

}

});

关于javascript - 获取并检查 NodeJS 中读取的 JSON 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59473319/

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