Javascript NodeJS:异步/回调问题

Javascript NodeJS:异步/回调问题,javascript,sql,node.js,asynchronous,callback,Javascript,Sql,Node.js,Asynchronous,Callback,我正在研究NodeJS框架,其中sql在主体之后执行 我使用了基本的sql连接块,但不确定如何在该块中集成异步或回调 我的代码如下: var mysql = require('mysql'); var pool = mysql.createPool({ connectionLimit: 100, host: "localhost", user: "...user...", password: "...pw...", database: "..

我正在研究NodeJS框架,其中sql在主体之后执行

我使用了基本的sql连接块,但不确定如何在该块中集成异步或回调

我的代码如下:

 var mysql = require('mysql');
 var pool = mysql.createPool({
     connectionLimit: 100,
     host: "localhost",
     user: "...user...",
     password: "...pw...",
     database: "...db..."
  });
。。。 ...


您必须在内部回调中发送响应,因为这是数据唯一可用的位置:

app.get('/*', function(req, res) {

    var sql = mysql.format("SELECT * FROM test_rest WHERE location=? LIMIT 2", [user_input]);

    pool.getConnection(function(err,connection) {
        if (err) {
            res.status(500).send("could not get database connection");
            return;
        }
        connection.query(sql, function (err, result, fields) {
            connection.release();
            if (err) {
                res.status(500).send("database query failed");
                return;
            }
            var jsonResponse = [];
            var obj = {};
            obj["text"] = 'hi this is' + user_nsew_1;

            jsonResponse.push(obj);
            res.send(jsonResponse);
         });
     });
 });

此外,由于您似乎计划将用户输入合并到sql查询中,因此请注意,输入已被适当清理,因此您不会受到攻击。

您必须确保您使用的MySQL库支持Promise。这是
wait
async
所必需的。您可以使用promisifyAll包装库。或者你可以用promise封装mysql库

例如
async db.js

const mysql = require('mysql')
const pool = mysql.createPool({
   connectionLimit: 100,
   host: "localhost",
   user: "...user...",
   password: "...pw...",
   database: "...db..."
});
let query = function( sql, values ) {
   return new Promise(( resolve, reject ) => {
     pool.getConnection(function(err, connection) {
        if (err) {
          reject( err )
        } else {
          connection.query(sql, values, ( err, rows) => {
              if ( err ) {
                 reject( err );
              } else {
                 resolve(rows);
              }
              connection.release();
          });
       }
     });
   });
}

module.exports = { query }
const { query } = require('./async-db')
async function selectAllData( ) {
  let sql = 'SELECT * FROM my_table'
  let dataList = await query( sql )
  return dataList
}

async function getData() {
  let dataList = await selectAllData()
  console.log( dataList )
}

getData()
用法
test.js

const mysql = require('mysql')
const pool = mysql.createPool({
   connectionLimit: 100,
   host: "localhost",
   user: "...user...",
   password: "...pw...",
   database: "...db..."
});
let query = function( sql, values ) {
   return new Promise(( resolve, reject ) => {
     pool.getConnection(function(err, connection) {
        if (err) {
          reject( err )
        } else {
          connection.query(sql, values, ( err, rows) => {
              if ( err ) {
                 reject( err );
              } else {
                 resolve(rows);
              }
              connection.release();
          });
       }
     });
   });
}

module.exports = { query }
const { query } = require('./async-db')
async function selectAllData( ) {
  let sql = 'SELECT * FROM my_table'
  let dataList = await query( sql )
  return dataList
}

async function getData() {
  let dataList = await selectAllData()
  console.log( dataList )
}

getData()

请理解,异步回调中的
if(err)throw err
不是有用的错误处理,它会回来咬你。您处于响应处理程序中。你可以做一个
res.status(500)。发送(某物);返回而不是实际的错误处理。可能重复