我在node-mariasql库上看到以下代码 -
var inspect = require('util').inspect;
var Client = require('mariasql');
var c = new Client();
c.connect({
host: '127.0.0.1',
user: 'foo',
password: 'bar',
db: 'mydb'
});
c.on('connect', function() {
console.log('Client connected');
})
.on('error', function(err) {
console.log('Client error: ' + err);
})
.on('close', function(hadError) {
console.log('Client closed');
});
var pq = c.prepare('SELECT * FROM users WHERE id = :id AND name = :name');
c.query(pq({ id: 1337, name: 'Frylock' }))
.on('result', function(res) {
res.on('row', function(row) {
console.log('Result row: ' + inspect(row));
})
.on('error', function(err) {
console.log('Result error: ' + inspect(err));
})
.on('end', function(info) {
console.log('Result finished successfully');
});
})
.on('end', function() {
console.log('Done with all results');
});
c.end();
此输出已指定为 -
/* output:
Client connected
Query #1 row: [ 'first query' ]
Query #1 finished successfully
Query #2 was aborted
Query #3 row: [ 'third query' ]
Query #3 finished successfully
Done with all queries
Client closed
*/
对我而言,c.connect
看起来是异步调用。那么代码的底部是不是应该放在c.on(' connect')回调中?否则,当我c.query
或c.prepare
代码的底部。
var pq = c.prepare('SELECT * FROM users WHERE id = :id AND name = :name');
c.query(pq({
id: 1337,
name: 'Frylock'
}))
.on('result', function (res) {
res.on('row', function (row) {
console.log('Result row: ' + inspect(row));
})
.on('error', function (err) {
console.log('Result error: ' + inspect(err));
})
.on('end', function (info) {
console.log('Result finished successfully');
});
})
.on('end', function () {
console.log('Done with all results');
});
c.end();
答案 0 :(得分:1)
mysql协议要求您在发送下一个命令之前等待上一个命令完成,因此大多数客户端会自动拥有某种internal queue和move to next command in the queue。例如,此代码不会并行执行3个查询:
c.query('select sleep(1)');
c.query('select sleep(2)');
c.query('select 1', console.log);
相反,它会在3秒后输出“选择1”结果。因此,“连接已经打开的保证是什么”的答案是“客户端设计保证了这一点”