💡
ExpressのPOSTメソッド内で非同期処理の必要な外部APIを呼び出す方法
はじめに
私は現在Node.jsの勉強の一環として、Notionページの内容をWebページ表示できるようなものを作成しています。その中でつまづいたExpressのPOSTメソッドの中で非同期処理の必要な外部APIが呼べない点を回避する方法についてまとめたいと思います。NotionAPIを使用していて同じく非同期処理で詰まった人の参考にしていただけたら幸いです。
【やりたいこと】
reqで受け取ったIDをもとにNotionのAPIを操作し、データの取得をしたい。
app.post("/test",(req,res) => {
var database_id = req.body.database_id;
const database_children = await notion.databases.query({database_id: database_id,});
res.render("./index.ejs",{result:result});
});
単純にコーディングするとPOSTの中でawaitは使用できないメッセージが出ます。
【解決策】
概要
POSTメソッドで動作する関数を非同期関数にしてその中で非同期処理を行なっています。
下のコードではPOSTメソッドが長くなってしまうため、分けていますが実際は非同期処理が必要な外部APIをPOSTメソッドの中で呼び出すことが可能です。
実際のコード
async function getContents(block_id,page_title) {
var children_page = await notion.blocks.children.list({block_id: block_id,});
console.log(children_page);
var create_by = children_page.results[0].created_time;
create_by = create_by.split("T")[0];
create_by = create_by.replaceAll("-","/");
const data = {title:page_title,create_by:create_by,image:[],texts:[]};
for (const block of children_page.results) {
if (block.type === 'paragraph' && block.paragraph.rich_text.length > 0) {
data.texts.push(block.paragraph.rich_text[0].text.content);
}
if (block.type === 'image') {
data.image.push(block.image.file.url);
}
}
console.log(data);
return data;
}
app.post("/page", async (req,res) => {
try{
const data = await getContents(req.body.page_id,req.body.page_title);
res.render("./page.ejs",{data:data});
}catch(error) {
res.status(500).json({ error: error.message });
}
});
まとめ
今回はExpressで外部のAPIを呼び出す際につまづいた非同期処理についてまとめました。上のコードはChatGPTに出力してもらったコードですが、参考サイトとしてとてもわかりやすく勉強になった記事を載せました。非同期処理の使い方に関してはこちらの記事の方が詳しく書かれているので参考にしていただければ思います。
Discussion