NodeJS:异步/回调问题

问题描述:

我正在研究NodeJS框架,其中sql在主体之后执行。NodeJS:异步/回调问题

我已经使用了基本的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) throw err; 
     connection.query(sql, function (err, result, fields) { 
      connection.release(); 
      if (err) throw err; 


     }); 
    }); 


var jsonResponse = []; 
var obj = {}; 
obj["text"] = 'hi this is' + user_nsew_1; 

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

请理解,如果'(ERR)在异步回调扔err'是没有用的错误处理,并会回来咬你。你在一个响应处理程序。你可以做一个'res.status(500).send(something);返回;'而不是在实际的错误处理上踢球。 – jfriend00

+0

[我如何从异步调用返回响应?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

你必须发送内侧的内回调的响应,因为这是唯一的地方该数据可用:

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查询中,请小心输入已经过适当的消毒,因此您不容易受到sql injection attacks的攻击。

您将不得不确保您使用的MySQL库支持Promise。哪些是awaitasync所需的。您可以使用Bluebird's 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 } 

用法test.js

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()