我正在使用do_sql_query函数执行sql查询,该函数在完成时返回字符串。如何将字符串发送回我的Ajax请求。我对如何使用中间件和正确的回调使其工作感到困惑。
我正在使用该库来帮助我执行mysql查询:mysql
app.post('/check', (req,res)=>{
res.send(do_sql_query())
})
do_sql_query = ()=>{
var string_to_be_returned;
mysql_query_function('SELECT * FROM...', (results)=>{
string_to_be_returned = results.string_Response
})
return string_to_be_returned
}
答案 0 :(得分:0)
代码段的主要问题是您返回得太早,而不是等待查询执行。
任何异步函数(基本上是带有回调参数或类似函数的异步函数)都需要包装Promise或您选择的模式,以便路由可以推迟发送响应直到查询完成。
这仅是示例代码:
// promise approach
app.post('/check', (req, res) => {
do_sql_query()
.then(value => {
res.send(value)
})
.catch(err => {
// log or something
})
})
// await approach
app.post('/check', async (req, res) => {
const value = await do_sql_query()
res.send(value)
})
do_sql_query = () => {
return new Promise((resolve, reject) => {
// Not sure of this function, but lets assume it queries the db in an async manner
// missing quote --v
mysql_query_function('SELECT * FROM...', results => {
const string_to_be_returned = results.string_Response
resolve(string_to_be_returned)
}) // <-- missing in your original snippet
})
}
答案 1 :(得分:0)
正如@Chris所说,问题是您没有等待查询执行。我自己不是Promises的粉丝(除非您可以使用await/async
),所以我将向您展示如何使用常规回调进行操作。
app.post('/check',(req,res)=>{
do_sql_query((err, results) => {
if(err) return res.status(500).send("Something went wrong");
return res.send(results);
});
});
do_sql_query = (callback) = > {
mysql_query_function('SELECT * FROM...`, (err, results) =>{
// you don't show how you're defining your mysql_query_function, but most node is error-first callback
if (err) return callback(err);
return callback(null, results);
}
}
请注意,无论何时进行异步调用,您都无法真正“返回”该调用的结果,因为这些结果要到以后才能使用。您必须使用某种形式的回调函数(无论是否将其包装在Promise语法糖中)来处理您的异步调用的结果。