2016-11-10 59 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();}); 
     } 
    }); 
    }); 
}); 

我不知道这个代码最后一块几乎是正确的或完全错误的。 但我只能说数据库表(test_table)没有更新。

+0

什么是fieldOne和fieldTwo?你是从查询参数还是从POST请求到/ db? – lkostka

+0

是的,它们只是test_table中字段的示例,您可能认为它们包含一些int值。我想弄清楚如何在代码中集成这个查询。我认为有几种选择,我需要从一个开始。 fieldOne和fieldTwo是查询的一部分,我没有从任何地方获取它们。 – Michel

+0

如果您想在执行完所有记录后执行此查询,那么为什么不在else'block'中添加client.query? – 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); 
} 

这里是(用表格的版本),我的意见/页/ 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专家。