2016-11-10 1 views
1

Я работаю с Node.js и Heroku; и у меня есть вопрос по поводу следующего кода, который я нашел в Интернете:Node.js и Heroku, как вставить второй запрос?

app.get('/db', function (request, response) { 
    pg.connect(process.env.DATABASE_URL, function(err, client, done) { 
    client.query('SELECT * FROM test_table', function(err, result) { 
     done(); 
     if (err) 
     { console.error(err); response.send("Error " + err); } 
     else 
     { response.render('pages/db', {results: result.rows}); } 
    }); 
    }); 
}); 

Это перечисляет содержимое test_table таблицы, но я также хочу, чтобы выполнить следующий запрос:

* "INSERT INTO test_table (fieldOne, fieldTwo) VALUES (MAX (fieldOne) +1, MAX (fieldTwo) 2)»

Как я могу интегрировать это в коде выше?

Вот то, что я пытался, но безуспешно:

app.get('/db', function (request, response) { 
    pg.connect(process.env.DATABASE_URL, function(err, client, done) { 
    client.query('SELECT * FROM test_table', function(err, result) { 
     done(); 
     if (err) 
     { console.error(err); response.send("Error " + err); } 
     else { 
     response.render('pages/db', {results: result.rows}); 
     client.query("INSERT INTO test_table (id, name) VALUES (MAX(id)+1,'TEST')", function(err, result) {done();}); 
     } 
    }); 
    }); 
}); 

Я не знаю, если это последний кусок кода почти прямо или совершенно неправильно. Но все, что я могу сказать, это то, что таблица DB (test_table) не обновляется.

+0

Что такое fieldOne и fieldTwo? Получаете ли вы их из параметров запроса или из запроса POST в/db? – lkostka

+0

Да, это просто примеры полей в test_table, вы можете думать о них как о том, что они содержат некоторые значения int. Я пытаюсь выяснить, как я могу интегрировать этот запрос внутри кода. Я предполагаю, что есть несколько вариантов, мне нужно начать с одного. fieldOne и fieldTwo являются частью запроса, который я не получаю нигде. – Michel

+0

Если вы хотите выполнить этот запрос, как только у вас есть все записи, почему бы не добавить client.query в блок else? – lkostka

ответ

0

В случае это может помочь кому-то еще, я выкладываю здесь изменение, которое я сделал, чтобы мой код работает:

app.get('/db', function (request, response) { 
    pg.connect(process.env.DATABASE_URL, function(err, client, done) { 
    client.query('SELECT * FROM test_table', function(err, result) { 
     done(); 
     if (err) 
     { console.error(err); response.send("Error " + err); } 
     else { 
     response.render('pages/db', {results: result.rows}); 
     client.query("INSERT INTO test_table (id, name) VALUES ((SELECT MAX(id) FROM test_table)+1,'TEST')", function(err2, result2) {done();}); 
     } 
    }); 
    }); 
}); 

Там должны быть и другие вещи, чтобы сказать об этом, но, по крайней мере, теперь он работает.

-1

Этот ответ подразумевается, что некоторые разработчики, пытающиеся получить доступ к Node.js, столкнулись с теми же вопросами, что и я. Вот tiny site Я сделал в качестве варианта использования, чтобы получить некоторую практику. Я показываю в дальнейшем соответствующий код. Он будет надежно помочь кому-то позже.

Чтение Getting Started on Heroku with Node.js Я получил свои руки на эту тему.

Я начал с this, как указано в документе, упомянутом выше.

Вот соответствующие изменения, которые я сделал в верхней index.js файла:

app.get('/', function (request, response) { 
    pg.connect(process.env.DATABASE_URL, function(err, client, done) { 
    client.query('SELECT * FROM Prime_List ORDER BY rank', function(err, result) { 
     done(); 
     if (err) 
     { console.error(err); response.send("Error " + err); } 
     else { 
     client.query('SELECT * FROM Leap_List ORDER BY rank', function(err, resultLeap) { 
      done(); 
      if (err) {console.error(err); response.send("Error " + err);} 
      else { 
      response.render('pages/index', {results: result.rows, resultsLeap:resultLeap.rows, ua:agent}); 
      lastPrime=result.rows[result.rows.length-1].prime; 
      newPrime=getNextPrime(result.rows); 
      client.query("INSERT INTO Prime_List (rank,prime) VALUES ((SELECT MAX(rank) FROM Prime_List)+1,"+newPrime+")", 
      function(err, result2) { 
       done(); 
       if (err){ console.error(err); response.send("Error " + err); } 
       else { 
       client.query("SELECT COUNT(*) FROM Leap_List WHERE (leap="+(newPrime-lastPrime)/2+")", 
       function(err, resultCnt) { 
        done(); 
        if (err) { console.error(err); response.send("Error " + err); } 
        else { 
        if (resultCnt.rows[0].count==1) { 
         client.query("UPDATE Leap_List SET count=count+1 WHERE (leap="+(newPrime-lastPrime)/2+")", 
         function(err, resultUpd) { 
          done(); 
          if (err) { console.error(err); response.send("Error " + err); } 
         }); 
        } else /*(resultCnt[0]==0)*/ { 
         leapQuery="INSERT INTO Leap_List (rank,leap,initial,final,count) VALUES"; 
         leapQuery+=" ((SELECT MAX(rank) FROM Leap_List)+1,"; 
         leapQuery+=(newPrime-lastPrime)/2+","; 
         leapQuery+=lastPrime+","; 
         leapQuery+=newPrime+","; 
         leapQuery+="1)"; 
         client.query(leapQuery, 
         function(err, resultUpd) { 
         done(); 
         if (err) { console.error(err); response.send("Error " + err); } 
         }); 
        }}}); 
       }}); 
      }}); 
     }}); 
    }); 
}); 


function getNextPrime(primeList) { 
    var resultPrime = primeList[primeList.length-1].prime + 2; 

    do {for (i=1; i<primeList.length; i++) { 
     if (primeList[i].prime*primeList[i].prime>resultPrime) return resultPrime; 
     if (resultPrime%primeList[i].prime == 0) break; 
     } 
     resultPrime+=2; 
    } while (true); 
} 

Ниже приведены соответствующие изменения, которые я сделал в Views/страниц/index.ejs файл (версия с помощью таблиц):

Первая таблица (простые числа):

<table cellspacing=5> 
    <% var npr=15; i=0; results.forEach(function(r) { 
     if ((i==90)&&(npr==15)) { npr--; i=0; %> </table><br/><table> <% } 
     if ((i==70)&&(npr==14)) { npr--; i=0; %> </table><br/><table> <% } 
     if (i%npr==0) { %> <tr align=right> <% } %> 
     <td bgcolor=#FFFF66><%= r.rank %></td><td bgcolor=#66FF66><font color=#000080><%= r.prime %></font></td> 
     <% if (i%npr==(npr-1)) { %> </tr> <% } %> 
     <% i++; %> 
    <% }); %> 
</table> 

Вторая таблица (в прыжках):

<table cellspacing=5> 
<tr align=center> 
<td bgcolor=#FFAAFF>Rank</td><td bgcolor=#FFAAFF>Leap</td> 
<td bgcolor=#FFAAFF>Count</td><td bgcolor=#FFAAFF colspan=2>First case</td> 
</tr> 
    <% var npr=5; i=0; total=0; 
     resultsLeap.forEach(function(r) { 
     total+=r.count; %> 
     <tr align=right> 
     <td bgcolor=#FFFF99><%= r.rank %></td> 
     <td bgcolor=#EEDD88><font color=#000080><%= r.leap %></font></td> 
     <td bgcolor=#EEDD88><font color=#000080><%= r.count %></font></td> 
     <td bgcolor=#88EEDD><font color=#000080><%= r.initial %></font></td> 
     <td bgcolor=#88EEDD><font color=#000080><%= r.final %></font></td> 
     </tr> 
     <% i++; %> 
    <% }); %> 
<tr align=right> 
<td bgcolor=#FFAAFF colspan=2>Total :</td> 
<td bgcolor=#FFAAFF><%= total %></td> 
</tr> 
</table> 

Оставьте свои комментарии или комментарии относительно того, как я это сделал в приведенном выше коде, если вам посчастливилось прочитать это и стать экспертом в Node.js.

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