如何将数据发送回ajax成功函数?

时间:2018-09-25 22:59:29

标签: node.js express

我正在使用do_sql_query函数执行sql查询,该函数在完成时返回字符串。如何将字符串发送回我的A​​jax请求。我对如何使用中间件和正确的回调使其工作感到困惑。

我正在使用该库来帮助我执行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
}

2 个答案:

答案 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语法糖中)来处理您的异步调用的结果。