我正在使用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) 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 :(得分:1)
您必须在内部回调中发送响应,因为这是数据可用的唯一位置:
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的攻击。</ p>
答案 1 :(得分:0)
您必须确保您使用的MySQL库支持Promise。 >>> LegacyIterable.__len__ = lambda x: 3
>>> choice(LegacyIterable())
'c'
和await
需要哪些。您可以使用Bluebird's promisifyAll来包装库。或者你可以使用promise来封装mysql库。
例如async
:
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