我正在尝试检查用户是否存在(在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。如果一切都在readfile内运行,您会立即注意到相同的电子邮件。
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)戈切夫;
问题是您正在调用console.log(“ userExist值:” + userExist +“”);太早了。在您拨打该行时,尚未定义userExist。这是因为server.readFile()函数需要一个回调,并且一旦读取文件,该回调函数就会执行。但是,读取文件通常会花费一些时间,因此程序会继续运行。它执行console.log(“ userExist值:” + 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);
}
}
});