Javascript NodeJS:异步/回调问题
我正在研究NodeJS框架,其中sql在主体之后执行 我使用了基本的sql连接块,但不确定如何在该块中集成异步或回调 我的代码如下: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: "..
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)。发送(某物);返回代码>而不是实际的错误处理。可能重复