函数没有 return 从 DB 获取值。 Node.js
Function doesn't return fetched values from DB . Node.js
我从星期四开始就被这个问题困扰了,我不知道是什么问题。查看日志看起来 HTTP 请求在从数据库检索数据之前已完成。尽管我尝试了 async/await 的所有组合...
你们知道如何解决这个问题吗?
app.get("/getData", (req, res) => {
let data = oracledb.getConnection(
{
user: "hr",
password: "hr",
connectString: "localhost/user"
},
(err, connection) => {
if (err) {
console.error(err.message);
return;
}
queries.getData(connection, 3);
}
);
console.log('Arrives here:', data)
res.send(data)
})
const getData = (conn, id) => {
const query = `SELECT * FROM SoapDataObject WHERE id = ${id}`;
let result = conn.execute(query, (err, result)=> {
if (err) {
console.error(err.message);
doRelease(conn);
return;
}
// console.log(result.metaData);
console.log(result.rows);
doRelease(conn);
return result.rows
})
return result;
};
控制台显示:
REST API server started on: 3000
[1] Listening on port 8001
[1] WSDL available at http://localhost:8001/soapWs?wsdl
[1] Arrives here: undefined
[1] [ [ 3, '1010', 11, 11, 11, 11, 11, 2 ] ]
虽然很简单,但问题出在这里:
let data = oracledb.getConnection(
{
user: "hr",
password: "hr",
connectString: "localhost/user"
},
(err, connection) => {
if (err) {
console.error(err.message);
return;
}
queries.getData(connection, 3);
}
);
console.log('Arrives here:', data)
res.send(data)
请注意,无论 getData 的结果是什么,在您 return
之前都不会 returned。另外,在你的这个方法中:
const getData = (conn, id) => {
const query = `SELECT * FROM SoapDataObject WHERE id = ${id}`;
let result = conn.execute(query, (err, result)=> {
if (err) {
console.error(err.message);
doRelease(conn);
return;
}
// console.log(result.metaData);
console.log(result.rows);
doRelease(conn);
return result.rows
})
return result;
};
请注意,您不能像在同步编程中那样仅从回调中 return 对象。而在这两种方法中,您都试图 return 回调方法的执行结果,但这种方法不起作用。您必须在回调范围内捕获结果,然后传播您的结果。 (Johnathan 建议的更优雅的解决方案是承诺调用 SQL 语句的方法,以便您可以 return 'promises' 然后获取值。(记住, async/await 只能与 promises 一起使用,不能与回调一起使用。
示例实现因此变成(使用承诺):
app.get("/getData", (req, res) => {
const dataPromise = new Promise((resolve, reject) => {
oracledb.getConnection(
{
user: "hr",
password: "hr",
connectString: "localhost/user"
},
(err, connection) => {
if (err) {
reject(error);
return;
}
queries.getData(connection, 3).then((response) => {
resolve(response)
}).catch(qerror => {
reject(qerror);
})
}
)
});
dataPromise.then((data) => {
res.send(data);
}).catch(error => {
// Your error handling here
})
})
const getData = (conn, id) => {
return new Promise((resolve, reject) => {
const query = `SELECT * FROM SoapDataObject WHERE id = ${id}`;
conn.execute(query, (err, result) => {
if (err) {
doRelease(conn);
reject(err);
return;
}
doRelease(conn);
resolve(result.rows);
})
});
};
或者,如果您希望坚持回调:
app.get("/getData", (req, res) => {
oracledb.getConnection(
{
user: "hr",
password: "hr",
connectString: "localhost/user"
},
(err, connection) => {
if (err) {
res.status(500).send(error);
return;
}
const id = 3;
const query = `SELECT * FROM SoapDataObject WHERE id = ${id}`;
connection.execute(query, (qerr, result) => {
if (qerr) {
doRelease(connection);
// Replace 500 with code of your choice
res.status(500).send(qerr);
return;
}
doRelease(connection);
res.status(200).send(result.rows);
return;
})
}
);
});
我从星期四开始就被这个问题困扰了,我不知道是什么问题。查看日志看起来 HTTP 请求在从数据库检索数据之前已完成。尽管我尝试了 async/await 的所有组合...
你们知道如何解决这个问题吗?
app.get("/getData", (req, res) => {
let data = oracledb.getConnection(
{
user: "hr",
password: "hr",
connectString: "localhost/user"
},
(err, connection) => {
if (err) {
console.error(err.message);
return;
}
queries.getData(connection, 3);
}
);
console.log('Arrives here:', data)
res.send(data)
})
const getData = (conn, id) => {
const query = `SELECT * FROM SoapDataObject WHERE id = ${id}`;
let result = conn.execute(query, (err, result)=> {
if (err) {
console.error(err.message);
doRelease(conn);
return;
}
// console.log(result.metaData);
console.log(result.rows);
doRelease(conn);
return result.rows
})
return result;
};
控制台显示:
REST API server started on: 3000
[1] Listening on port 8001
[1] WSDL available at http://localhost:8001/soapWs?wsdl
[1] Arrives here: undefined
[1] [ [ 3, '1010', 11, 11, 11, 11, 11, 2 ] ]
虽然很简单,但问题出在这里:
let data = oracledb.getConnection(
{
user: "hr",
password: "hr",
connectString: "localhost/user"
},
(err, connection) => {
if (err) {
console.error(err.message);
return;
}
queries.getData(connection, 3);
}
);
console.log('Arrives here:', data)
res.send(data)
请注意,无论 getData 的结果是什么,在您 return
之前都不会 returned。另外,在你的这个方法中:
const getData = (conn, id) => {
const query = `SELECT * FROM SoapDataObject WHERE id = ${id}`;
let result = conn.execute(query, (err, result)=> {
if (err) {
console.error(err.message);
doRelease(conn);
return;
}
// console.log(result.metaData);
console.log(result.rows);
doRelease(conn);
return result.rows
})
return result;
};
请注意,您不能像在同步编程中那样仅从回调中 return 对象。而在这两种方法中,您都试图 return 回调方法的执行结果,但这种方法不起作用。您必须在回调范围内捕获结果,然后传播您的结果。 (Johnathan 建议的更优雅的解决方案是承诺调用 SQL 语句的方法,以便您可以 return 'promises' 然后获取值。(记住, async/await 只能与 promises 一起使用,不能与回调一起使用。
示例实现因此变成(使用承诺):
app.get("/getData", (req, res) => {
const dataPromise = new Promise((resolve, reject) => {
oracledb.getConnection(
{
user: "hr",
password: "hr",
connectString: "localhost/user"
},
(err, connection) => {
if (err) {
reject(error);
return;
}
queries.getData(connection, 3).then((response) => {
resolve(response)
}).catch(qerror => {
reject(qerror);
})
}
)
});
dataPromise.then((data) => {
res.send(data);
}).catch(error => {
// Your error handling here
})
})
const getData = (conn, id) => {
return new Promise((resolve, reject) => {
const query = `SELECT * FROM SoapDataObject WHERE id = ${id}`;
conn.execute(query, (err, result) => {
if (err) {
doRelease(conn);
reject(err);
return;
}
doRelease(conn);
resolve(result.rows);
})
});
};
或者,如果您希望坚持回调:
app.get("/getData", (req, res) => {
oracledb.getConnection(
{
user: "hr",
password: "hr",
connectString: "localhost/user"
},
(err, connection) => {
if (err) {
res.status(500).send(error);
return;
}
const id = 3;
const query = `SELECT * FROM SoapDataObject WHERE id = ${id}`;
connection.execute(query, (qerr, result) => {
if (qerr) {
doRelease(connection);
// Replace 500 with code of your choice
res.status(500).send(qerr);
return;
}
doRelease(connection);
res.status(200).send(result.rows);
return;
})
}
);
});