2013-04-21 5 views
5

Все, что я хочу сделать, это вставить некоторые данные, если моя база данных не имеет этого, поэтому я вставляю Insert SQL в свою функцию обратного вызова моего Select SQL, но я получил ошибку как это:Node.js и mysql Обратный вызов: запрос в обратном вызове

{ [Error: Cannot enqueue Query after invoking quit.] code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }

мой фрагмент кода здесь:

db.query('SELECT count(*) as Resultcount FROM tablename WHERE email = ? and password = ?', [post.email, post.password], function(error, result){ 
    if (result[0].Resultcount == 0){ 
     var query2 = db.query('INSERT INTO tablename SET ?', [post], function(err, result) { 
      if(err){ 
       console.log(err); 
      } 
      console.log(result); 
      }); 
    } 
    else{ 
     console.log('have data already'); 
    } 
}); 

Может кто-нибудь дать мне несколько советов? Благодаря

---- обновление ----

фактически, функция обратного вызова выберите SQL не анонимная функция, мой фрагмент кода о db.end(), как это:

var QueryResults = new queryResultFuntion(Back_results); 

    db.query('SELECT count(*) as Resultcount FROM tablename WHERE email = ? and password = ?', [post.email, post.password], QueryResults.queryResult); 


    db.end(); 
+0

Вы закрываете соединение с БД где-то после этого кода? – loganfsmyth

+0

Да, когда я заканчиваю db.query ('select ...'), я вызывал db.end(); – Arvin

+0

Это означает, что к моменту запуска вашего запроса INSERT соединение будет закрыто. Добавьте этот код к своему вопросу, и я отвечу. – loganfsmyth

ответ

14

вы db.end() вызова очереди соединения, чтобы закрыть, как только SELECT завершен, поэтому при попытке сделать внутренний INSERT запрос, подключение к базе данных будет закрыто, следовательно, ошибка PROTOCOL_ENQUEUE_AFTER_QUIT, как вы пытаетесь очереди нового после закрытия соединения.

В зависимости от того, как вы создаете соединение, вы должны либо переместить свой вызов db.end() внутри обратных вызовов, либо вообще не иметь никакого вызова db.end(), если соединение открывается при запуске программы.

+0

Не делать 'db.end()' при всех результатах в том, что нужно завершить мой скрипт (который я запускаю в командной строке с помощью команды 'node') с помощью Ctrl-C. Но это избавилось от 'PROTOCOL_ENQUEUE_AFTER_QUIT' – Lori

+2

@Lori Correct, поэтому я предварял его« В зависимости от того, как вы создаете соединение ». Если вы пишете сервер узлов, например, вы только открываете соединение один раз, и нет никаких ожиданий, что сервер будет каждый выход в любом случае. Если вы пишете скрипт, вы хотите завершить соединение, как только все операции в вашем скрипте будут завершены. – loganfsmyth

Смежные вопросы