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);
});
答
你必须发送内侧的内回调的响应,因为这是唯一的地方该数据可用:
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。哪些是await
和async
所需的。您可以使用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()
请理解,如果'(ERR)在异步回调扔err'是没有用的错误处理,并会回来咬你。你在一个响应处理程序。你可以做一个'res.status(500).send(something);返回;'而不是在实际的错误处理上踢球。 – jfriend00
[我如何从异步调用返回响应?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –