Javascript Async.js系列和节点mysql查询';我们不能吵架
我目前正在尝试使用async.js系列控制流函数按顺序运行一组MySQL查询。但我一直收到以下错误:Javascript Async.js系列和节点mysql查询';我们不能吵架,javascript,node.js,asynchronous,node-mysql,async.js,Javascript,Node.js,Asynchronous,Node Mysql,Async.js,我目前正在尝试使用async.js系列控制流函数按顺序运行一组MySQL查询。但我一直收到以下错误: throw err; // Rethrow non-MySQL errors ^ TypeError: Cannot read property 'status' of undefined 我已经在async.series之外的单独函数中测试了查询,它们很好,并返回了数据,我认为错误的唯一原因是由于异步性质,当时它没有数据,因此出现错误,例如,当我记录我得到的行时: [] [
throw err; // Rethrow non-MySQL errors
^
TypeError: Cannot read property 'status' of undefined
我已经在async.series之外的单独函数中测试了查询,它们很好,并返回了数据,我认为错误的唯一原因是由于异步性质,当时它没有数据,因此出现错误,例如,当我记录我得到的行时:
[]
[]
[]
下面是异步函数:
function SQLuserDataAsync() {
connection.getConnection(function (err, connection) {
async.series([
function (callback) {
connection.query('SELECT status FROM users WHERE name= ?;',
[userval],
function (err, rows) {
if (rows[0]['status']) {
console.log("Account Status: " + accountval);
} else {
console.log(err);
}
callback(null, 'one');
});
},
function (callback) {
connection.query('SELECT account_type FROM settings_tbl WHERE id=(SELECT id FROM users WHERE name= ?);',
[userval],
function (err, rows) {
if (rows[0]['account_type']) {
var acctype = rows[0]['account_type'];
console.log("Account Type: " + acctype);
} else {
console.log(err);
}
callback(null, 'two');
});
},
function (callback) {
connection.query('SELECT type FROM settings_tbl WHERE id=(SELECT id FROM users WHERE name= ?);',
[userval],
function (err, rows) {
if (rows[0]['type']) {
var type = rows[0]['type'];
console.log("Type: " + type);
} else {
console.log(err);
}
callback(null, 'three');
});
}
]);
connection.release();
});
}
有什么建议可以作为错误的原因,或者我在这里做错了什么?您错过了函数的主回调函数
function SQLuserDataAsync() {
connection.getConnection(function (err, connection) {
async.series([
function (callback) {
// YOUR CODE
},
function (callback) {
// YOUR CODE
},
function (callback) {
// YOUR CODE
}
], function(error, results) { // <--- this is the main callback
connection.release();
});
});
}
函数SQLuserDataAsync(){
getConnection(函数(err,connection){
异步系列([
函数(回调){
//你的代码
},
函数(回调){
//你的代码
},
函数(回调){
//你的代码
}
],函数(错误,结果){/如果有一个在
userval
name中定义的用户,它将工作
但让我们简化代码:
function SQLuserDataAsync(userval) {
connection.getConnection(function (err, connection) {
async.waterfall([
// getting user
function (next) {
connection.query(
'SELECT * FROM users WHERE name = ? LIMIT 1',
[userval],
function (err, result) {
next(err, result[0]); // passing user to next function
});
},
// getting settings of user, maybe user_id (not id) in query below
function (user, next) {
connection.query(
'SELECT * FROM settings_tbl WHERE id = ? LIMIT 1',
[user.id],
function (err, result) {
next(err, user, result[0]);
});
},
// handling both user and settings
function (user, settings, next) {
console.log('User: ', user);
console.log('Settings: ', settings);
connection.release();
}
]);
});
}
SQLuserDataAsync('someone');
你试着去控制行了吗?可能没有导致错误的结果我现在可以试一下,我相信这就是错误的原因,但是那里有数据,如果我猜的话,它似乎是在查询运行之前执行的。我想不是因为你在回调函数中,可能是wrap is dataValues?行是空的,但是如果我在异步系列之外的单独函数中运行查询,它会工作。发现这不是问题,它似乎无法获取
[userval]
,这意味着它为空,因此没有行…即使是全局的。userval
的值在哪里设置?我通过socket.on设置它,并在这里将其设置为全局变量。socket.on('sqluser',function(userval){users=socket.id;userval=userval;SQLuserDataAsync(userval);})
可能事件没有被触发。或者,语句userval=userval;
没有将本地userval
的值分配给全局userval
。因此它保持为null。事件触发函数,函数调用时预期值在那里。我在函数启动之前记录了它异步系列