Promise with node-postgres queries always returns undefined
Promise with node-postgres queries always returns undefined
我在评估使用 node-postgres 查询的函数的结果时遇到问题,它总是 return“未定义”(此函数验证 JWT 令牌信息在数据库中的有效性):
const testTokenQuery = function(account_id, is_admin, query) {
return new Promise(function(resolve, reject){
pool.query(query, [account_id], function(err, result) {
if(err) {
reject("invalid")
}
else {
const bdd_account_id = String(JSON.stringify(result.rows[0].ac_account_id)).replace(/['"]+/g, '')
const bdd_is_admin = String(JSON.stringify(result.rows[0].ac_isadmin)).replace(/['"]+/g, '')
if (account_id == bdd_account_id || tok_is_admin == bdd_is_admin){
resolve ("valid")
}
else {
reject("invalid")
}
}
})
pool.end();
})
}
const testToken = (token) => {
const checkTokenId_query = sql = fs.readFileSync('./sqlqueries/checkTokenId_query.sql').toString()
const decodedToken = jwt.decode(token, 'JWT_SIGN_SECRET')
const tok_account_id = decodedToken.account_id
const tok_is_admin = decodedToken.isadmin
testTokenQuery(tok_account_id, tok_is_admin, checkTokenId_query)
.then(function(result){
console.log(result) //===================> It allways return the good value here
}).catch(function(err){
console.log(err);
})
}
const isvalid = testToken('eyJhbGciO............ltJT0PhXCjV00')
if(isvalid == "valid") {
console.log("valid token")
}
else if(isvalid == "invalid") {
console.log("not a valid token")
}
else{
console.log("I don't know : " + isvalid) //======> Always the result with isvalid = undefined
}
SQL 查询文件包含:
SELECT ac_account_id,
ac_isadmin,
ac_isactive
FROM table_accounts
WHERE ac_account_id = ;
结果总是“我不知道:未定义”,而 testTokenQuery 的 console.log(结果)。然后 returns“有效”...
我测试了回调:同样的问题,await/async:同样的问题...我要疯了...
感谢您的帮助!
此致。
更新:
我试图在极端情况下简化以使用异步进行测试,但我仍然有“未定义”作为答案:
const testTokenQuery = async (account_id, query) => {
pool.query(query, [account_id], function(err, result) {
return String(JSON.stringify(result.rows[0].ac_account_id))
})
}
const testToken = async (token) => {
const checkTokenId_query = sql = fs.readFileSync('./sqlqueries/checkTokenId_query.sql').toString()
const decodedToken = jwt.decode(token, 'JWT_SIGN_SECRET')
const tok_account_id = decodedToken.account_id
return await testTokenQuery(tok_account_id, checkTokenId_query)
}
const tokenReturn = async (token) => {
console.log(await testToken(token))
}
tokenReturn('eyJhbGciOiJ...........0PhXCjV00')
老实说,我以前没有使用过“node-query”,但我刚刚探索过this issue talk(这是关于 .end() 的,所以我认为这不是问题)。
从你的代码来看,我认为原因是你调用了函数本身,而不是回调(不是解析的)结果。我认为您可以使用 async-await 来实现它。
这不是完整的代码。在最后一部分中,我需要调用异步函数,所以我使用作用域函数来实现,但您可以根据需要进行更改。
尝试这样的事情:
const testTokenQuery = async (account_id, is_admin, query) => {
pool.query(query, [account_id], function(err, result) {
if(err) {
return "invalid";
} else {
const bdd_account_id = String(JSON.stringify(result.rows[0].ac_account_id)).replace(/['"]+/g, '')
const bdd_is_admin = String(JSON.stringify(result.rows[0].ac_isadmin)).replace(/['"]+/g, '')
if (account_id == bdd_account_id || tok_is_admin == bdd_is_admin){
return "valid";
} else {
return "invalid";
}
}
});
}
const testToken = async (token) => {
const checkTokenId_query = sql = fs.readFileSync('./sqlqueries/checkTokenId_query.sql').toString()
const decodedToken = jwt.decode(token, 'JWT_SIGN_SECRET')
const tok_account_id = decodedToken.account_id
const tok_is_admin = decodedToken.isadmin
return await testTokenQuery(tok_account_id, tok_is_admin, checkTokenId_query)
}
(async () => {
const isvalid = await testToken('eyJhbGciO............ltJT0PhXCjV00')
if(isvalid == "valid") {
console.log("valid token")
} else if(isvalid == "invalid") {
console.log("not a valid token")
} else {
console.log("I don't know : " + isvalid) //======> Always the result with isvalid = undefined
}
})();
这个函数没有return任何东西,对吧?不就是 return undefined
吗?
const testTokenQuery = async (account_id, query) => {
pool.query(query, [account_id], function(err, result) {
return String(JSON.stringify(result.rows[0].ac_account_id))
})
}
这与打印 undefined
.
的原因相同
const nada = (() => {})();
console.log(nada);
我在评估使用 node-postgres 查询的函数的结果时遇到问题,它总是 return“未定义”(此函数验证 JWT 令牌信息在数据库中的有效性):
const testTokenQuery = function(account_id, is_admin, query) {
return new Promise(function(resolve, reject){
pool.query(query, [account_id], function(err, result) {
if(err) {
reject("invalid")
}
else {
const bdd_account_id = String(JSON.stringify(result.rows[0].ac_account_id)).replace(/['"]+/g, '')
const bdd_is_admin = String(JSON.stringify(result.rows[0].ac_isadmin)).replace(/['"]+/g, '')
if (account_id == bdd_account_id || tok_is_admin == bdd_is_admin){
resolve ("valid")
}
else {
reject("invalid")
}
}
})
pool.end();
})
}
const testToken = (token) => {
const checkTokenId_query = sql = fs.readFileSync('./sqlqueries/checkTokenId_query.sql').toString()
const decodedToken = jwt.decode(token, 'JWT_SIGN_SECRET')
const tok_account_id = decodedToken.account_id
const tok_is_admin = decodedToken.isadmin
testTokenQuery(tok_account_id, tok_is_admin, checkTokenId_query)
.then(function(result){
console.log(result) //===================> It allways return the good value here
}).catch(function(err){
console.log(err);
})
}
const isvalid = testToken('eyJhbGciO............ltJT0PhXCjV00')
if(isvalid == "valid") {
console.log("valid token")
}
else if(isvalid == "invalid") {
console.log("not a valid token")
}
else{
console.log("I don't know : " + isvalid) //======> Always the result with isvalid = undefined
}
SQL 查询文件包含:
SELECT ac_account_id,
ac_isadmin,
ac_isactive
FROM table_accounts
WHERE ac_account_id = ;
结果总是“我不知道:未定义”,而 testTokenQuery 的 console.log(结果)。然后 returns“有效”...
我测试了回调:同样的问题,await/async:同样的问题...我要疯了...
感谢您的帮助!
此致。
更新: 我试图在极端情况下简化以使用异步进行测试,但我仍然有“未定义”作为答案:
const testTokenQuery = async (account_id, query) => {
pool.query(query, [account_id], function(err, result) {
return String(JSON.stringify(result.rows[0].ac_account_id))
})
}
const testToken = async (token) => {
const checkTokenId_query = sql = fs.readFileSync('./sqlqueries/checkTokenId_query.sql').toString()
const decodedToken = jwt.decode(token, 'JWT_SIGN_SECRET')
const tok_account_id = decodedToken.account_id
return await testTokenQuery(tok_account_id, checkTokenId_query)
}
const tokenReturn = async (token) => {
console.log(await testToken(token))
}
tokenReturn('eyJhbGciOiJ...........0PhXCjV00')
老实说,我以前没有使用过“node-query”,但我刚刚探索过this issue talk(这是关于 .end() 的,所以我认为这不是问题)。
从你的代码来看,我认为原因是你调用了函数本身,而不是回调(不是解析的)结果。我认为您可以使用 async-await 来实现它。 这不是完整的代码。在最后一部分中,我需要调用异步函数,所以我使用作用域函数来实现,但您可以根据需要进行更改。
尝试这样的事情:
const testTokenQuery = async (account_id, is_admin, query) => {
pool.query(query, [account_id], function(err, result) {
if(err) {
return "invalid";
} else {
const bdd_account_id = String(JSON.stringify(result.rows[0].ac_account_id)).replace(/['"]+/g, '')
const bdd_is_admin = String(JSON.stringify(result.rows[0].ac_isadmin)).replace(/['"]+/g, '')
if (account_id == bdd_account_id || tok_is_admin == bdd_is_admin){
return "valid";
} else {
return "invalid";
}
}
});
}
const testToken = async (token) => {
const checkTokenId_query = sql = fs.readFileSync('./sqlqueries/checkTokenId_query.sql').toString()
const decodedToken = jwt.decode(token, 'JWT_SIGN_SECRET')
const tok_account_id = decodedToken.account_id
const tok_is_admin = decodedToken.isadmin
return await testTokenQuery(tok_account_id, tok_is_admin, checkTokenId_query)
}
(async () => {
const isvalid = await testToken('eyJhbGciO............ltJT0PhXCjV00')
if(isvalid == "valid") {
console.log("valid token")
} else if(isvalid == "invalid") {
console.log("not a valid token")
} else {
console.log("I don't know : " + isvalid) //======> Always the result with isvalid = undefined
}
})();
这个函数没有return任何东西,对吧?不就是 return undefined
吗?
const testTokenQuery = async (account_id, query) => {
pool.query(query, [account_id], function(err, result) {
return String(JSON.stringify(result.rows[0].ac_account_id))
})
}
这与打印 undefined
.
const nada = (() => {})();
console.log(nada);