我幾乎是新的node.js,express和ES6,但試圖得到它的一個掛起。我寫了這段代碼,試圖實現乾淨的ES6驅動的函數和承諾。但是我遇到了繼承函數和值的問題,特別是next()。因此,這裏是迄今爲止寫我的代碼:承諾總是等待(錯誤的語法?)
let get_tags = (id) => {
var id = id;
return database.connection(
(connection) => {
return connection.query(
`SELECT
t.name
FROM
wp_terms AS t
INNER JOIN
wp_term_taxonomy AS tt ON tt.term_id = t.term_id
INNER JOIN
wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id
WHERE
tt.taxonomy IN ('post_tag') AND tr.object_id IN (${id})
ORDER BY t.name ASC`
)
}
).then(
(rows) => {
return rows;
}
)
}
router.get('/:city', (req, res, next) => {
switch (req.params.city) {
case 'neanderland':
var post_type = 'neanderland',
title = 'Hauptmeldungen',
region = 'Neanderland';
break;
case 'wuelfrath':
var post_type = 'wuelfrath',
title = 'Hauptmeldungen',
region = 'Wülfrath';
break;
case 'mettmann':
var post_type = 'mettmann',
title = 'Hauptmeldungen',
region = 'Mettmann';
break;
case 'haan':
var post_type = 'haan',
title = 'Hauptmeldungen',
region = 'Haan';
break;
case 'nevigestoenisheide':
var post_type = 'neviges-toenisheide',
title = 'Hauptmeldungen',
region = 'Neviges/Tönisheide';
break;
}
database.connection(
(connection) => {
return connection.query(
`SELECT
p.post_title as title,
p.post_author as author,
t.name as category,
p.ID as id,
p.post_date as date,
p.post_content as text,
p.post_excerpt as excerpt,
p.post_status as status,
p.post_name as slug_url,
pm1.meta_value as hero_thumb_id,
pm2.meta_value as hero_thumb_url
FROM
wp_posts p
LEFT JOIN
wp_postmeta pm1
ON (
pm1.post_id = p.id
AND pm1.meta_value IS NOT NULL
AND pm1.meta_key = "_thumbnail_id"
)
LEFT JOIN
wp_postmeta pm2
ON (
pm1.meta_value = pm2.post_id
AND pm2.meta_key = "_wp_attached_file"
AND pm2.meta_value IS NOT NULL
)
LEFT JOIN
wp_term_relationships tr
ON (
p.ID = tr.object_id
)
LEFT JOIN
wp_term_taxonomy tt
ON (
tr.term_taxonomy_id = tt.term_taxonomy_id
)
LEFT JOIN
wp_terms t
ON (
tt.term_id = t.term_id
)
WHERE
p.post_status="publish"
AND p.post_type="${post_type}"
AND tt.taxonomy = "category"
GROUP BY p.ID
ORDER BY
p.post_date DESC
LIMIT 100`
)
}
).then(
(rows) => {
var posts = [];
rows.forEach(
(element, index, array) => {
var arr = {
id : element.id,
paywall : element.text.includes('[not-level-free-user]'),
date : Date.parse(element.date).format("c"),
title : element.title,
excerpt : element.excerpt,
text : convert_text(element.text),
category : convert_category(element.category),
region : region,
author : convert_author(element.author),
slug : element.slug_url,
tags : '',
media : {
heroid : element.hero_thumb_id,
heroslug: element.hero_thumb_url
}
}
posts.push(arr);
}
);
return posts;
}
).then(
(data) => {
var arr = [];
data.forEach(
(element, index, array) => {
var id = element.id;
var item = get_tags(id).then(
(result) => {
if (result.length >= 1) {
// console.log(result) at this position returns e.g.
// [ RowDataPacket { name: 'Feuerwehr' },
// RowDataPacket { name: 'Nachwuchs' },
// RowDataPacket { name: 'Werbung' } ]
return result;
}
}
)
// console.log(item) at this position returns
// Promise { <pending> }
arr.push(item);
}
);
return arr;
}
).then(
(data) => {
res.json(data)
}
);
});
一切工作正常,直到倒數第二個則()。它只返回一個數組的空元素。看來,get_tags(id)不會保存下一次的結果。我在特定的位置做了一個控制檯日誌,但是我找不到錯誤...我想將get_tags的結果保存到arr變量中,以便爲next()函數返回它。你可以在評論中找到結果。
有沒有人有一個想法可能會出錯?
感謝您的幫助,請善待我......我仍是一名新秀! ;-)
可以最大限度地減少示例代碼以更簡潔說明問題?我不認爲我們需要看到兩個屏幕的SQL查詢... – deceze