![](/img/trans.png)
[英]Why Node.js website not working on live hosting server free tier?
[英]Node.js Working with Multiple Tier SQL
我正在忙於使用Node.js修改舊程序,並且代碼無法同步執行時遇到了一些困難。
PostgreSQL表結構如下:
create table tier01 (
t01_idno integer,
t01_desc char(10)
);
insert into tier01 values
(1, 'Tier 01 A'),
(2, 'Tier 01 B');
create table tier02 (
t02_t01_idno integer,
t02_idno integer,
t02_desc char(10)
);
insert into tier02 values
(1, 1, 'Tier 02 A'),
(1, 2, 'Tier 02 B'),
(2, 1, 'Tier 02 A');
create table tier03 (
t03_t02_idno integer,
t03_idno integer,
t03_desc char(10)
);
insert into tier03 values
(1, 1, 'Tier 02 A'),
(1, 2, 'Tier 02 B'),
(2, 1, 'Tier 02 A');
我要代表的本質上是
select t01_desc, t02_desc, t03_desc
from tier01, tier02, tier03
where t01_idno = t02_t01_idno
and t02_idno = t03_t02_idno
但是結果不是顯示為
'Tier 01 A ','Tier 02 A ','Tier 03 A '
'Tier 01 A ','Tier 02 A ','Tier 03 B '
'Tier 01 A ','Tier 02 B ','Tier 03 A '
'Tier 01 B ','Tier 02 A ','Tier 03 A '
'Tier 01 B ','Tier 02 A ','Tier 03 B '
我正在努力
'Tier 01 A'
- - - 'Tier 02 A'
- - - - - - 'Tier 03 A'
- - - - - - 'Tier 03 B'
- - - 'Tier 02 B'
- - - - - - 'Tier 03 A'
'Tier 01 B'
- - - 'Tier 02 A'
- - - - - - 'Tier 03 A'
- - - - - - 'Tier 03 B'
我能夠用PHP做到的而沒有任何問題
////
// SQL
////
$lv_sql = " select * from tier01 " .
" order by t01_idno ";
pg_prepare($lv_db, "tier01_cur", $lv_sql);
$lv_sql = " select * from tier02 " .
" where t02_t01_idno = $1 " .
" order by t02_idno ";
pg_prepare($lv_db, "tier02_cur", $lv_sql);
$lv_sql = " select * from tier03 " .
" where t03_t02_idno = $1 " .
" order by t03_idno ";
pg_prepare($lv_db, "tier03_cur", $lv_sql);
////
// Run
////
// LOOP THROUGH TIER01
$tier01_cur_query = pg_execute($lv_db, "tier01_cur", array());
while($tier01_cur = pg_fetch_row($tier01_cur_query)) {
echo '<p>' . $tier01_cur[1] . '</p>';
// LOOP THROUGH TIER02
$tier02_cur_query = pg_execute($lv_db, "tier02_cur", array($tier01_cur[0]));
while($tier02_cur = pg_fetch_row($tier02_cur_query)) {
echo '<p> - - - ' . $tier02_cur[2] . '</p>';
// LOOP THROUGH TIER03
$tier03_cur_query = pg_execute($lv_db, "tier03_cur", array($tier02_cur[1]));
while($tier03_cur = pg_fetch_row($tier03_cur_query)) {
echo '<p> - - - - - - ' . $tier03_cur[2] . '</p>';
}
}
}
但由於查詢是異步執行的,因此我無法使用Node.js再現相同的結果。 我想我通過使用async和pg模塊已經非常接近(或者可能根本沒有接近),但是代碼看起來很混亂,而且仍然是錯誤的。
////
// SQL
////
lv_sql = " select * from tier01 " +
" order by t01_idno ";
var tier01_cur = lv_sql;
lv_sql = " select * from tier02 " +
" where t02_t01_idno = $1 " +
" order by t02_idno ";
var tier02_cur = lv_sql;
lv_sql = " select * from tier03 " +
" where t03_t02_idno = $1 " +
" order by t03_idno ";
var tier03_cur = lv_sql;
////
// Run
////
gv_async.series ([
function(series) {
////
// CONNECT TO DATABASE
////
lv_pgsql = l_database.client();
lv_pgsql.connect();
series();
},
function(series) {
// QUERY TIER01
lv_pgsql.query(tier01_cur, [], function(err, res) {
// LOOP THROUGH TIER01
gv_async.forEachOf(res.rows, function(data, cnt, callbacktier01) {
console.log(res.rows[cnt].t01_desc);
// QUERY TIER02
lv_pgsql.query(tier02_cur, [res.rows[cnt].t01_idno], function(err, res) {
// LOOP THROUGH TIER02
gv_async.forEachOf(res.rows, function(data, cnt, callbacktier02) {
console.log(" - - - " + res.rows[cnt].t02_desc);
// QUERY TIER03
lv_pgsql.query(tier03_cur, [res.rows[cnt].t02_idno], function(err, res) {
// LOOP THROUGH TIER03
gv_async.forEachOf(res.rows, function(data, cnt, callbacktier03) {
console.log(" - - - - - - " + res.rows[cnt].t03_desc);
callbacktier03();
}, function(err, res) {
callbacktier02();
});
});
}, function(err, res) {
callbacktier01();
});
});
}, function(err, res) {
series();
});
});
},
function(series) {
////
// DISCONNECT DATABASE
////
lv_pgsql.end();
series();
// BEING CALLED WITH AJAX SO
// MUST SEND A RESPONSE
res.send(null);
}
]);
Node.js代碼為我提供以下輸出
Tier 01 A
Tier 01 B
- - - Tier 02 A
- - - Tier 02 B
- - - Tier 02 A
- - - - - - Tier 03 A
- - - - - - Tier 03 B
- - - - - - Tier 03 A
- - - - - - Tier 03 A
- - - - - - Tier 03 B
我在嘗試重新創建用於同步使用的代碼時遇到問題,盡管我不知道像這樣的正確的Node.js程序流程方法,任何建議將不勝感激
我相信我已經找到了解決方案,當使用內置的async and await(可從Node Version 7.6.0獲得)而不是npm async模塊完成時,它似乎可以工作。
這看起來也更加整潔和快捷,這很棒。
f_retrievedata(function() {
res.send(null);
});
async function f_retrievedata(callback) {
var lv_sql = "";
lv_sql = " select * from tier01 " +
" order by t01_idno ";
var tier01_cur = lv_sql;
lv_sql = " select * from tier02 " +
" where t02_t01_idno = $1 " +
" order by t02_idno ";
var tier02_cur = lv_sql;
lv_sql = " select * from tier03 " +
" where t03_t02_idno = $1 " +
" order by t03_idno ";
var tier03_cur = lv_sql;
var lr_tier01 = "";
var lr_tier02 = "";
var lr_tier03 = "";
lv_pgsql = l_database.client();
await lv_pgsql.connect();
// LOOP THROUGH TIER01
lr_tier01 = await lv_pgsql.query(tier01_cur, []);
lr_tier01 = await lr_tier01.rows;
for(cnt1 = 0; cnt1 < lr_tier01.length; cnt1 ++) {
console.log(lr_tier01[cnt1].t01_desc);
// LOOP THROUGH TIER02
lr_tier02 = await lv_pgsql.query(tier02_cur, [lr_tier01[cnt1].t01_idno]);
lr_tier02 = await lr_tier02.rows;
for(cnt2 = 0; cnt2 < lr_tier02.length; cnt2 ++) {
console.log( " - - - " + lr_tier02[cnt2].t02_desc);
// LOOP THROUGH TIER03
lr_tier03 = await lv_pgsql.query(tier03_cur, [lr_tier02[cnt2].t02_idno]);
lr_tier03 = await lr_tier03.rows;
for(cnt3 = 0; cnt3 < lr_tier03.length; cnt3 ++) {
console.log( " - - - - - - " + lr_tier03[cnt3].t03_desc);
}
}
}
callback();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.