我有一个 rss.xml.js 文件,它使用 astro 框架在项目中运行此脚本。
import rss from "@astrojs/rss";
import { fetchFeed } from "../lib/api";
export async function get(context) {
const posts = await fetchFeed();
return rss({
title: "My Online Store",
description: "Online For Everyone",
site: context.site,
items: posts.map((post) => ({
title: post.title,
pubDate: Date.now(),
description: post.description,
// customData: post.data.customData,
// Compute RSS link from post `slug`
// This example assumes all posts are rendered as `/blog/[slug]` routes
link: post.url,
})),
});
}
通常 fetchFeed 函数具有其
await
功能并且工作正常。然而在这种特殊情况下,我也必须将 map
方法设置为异步方法。对我来说,这似乎是我以前的网站(该网站有效)和当前网站(该网站无效)之间的唯一区别。
export const fetchFeed = async function () {
const allPosts = await import.meta.glob("./../pages/**/*.md");
// console.log("allPosts", allPosts);
const posts = Object.values(allPosts).map(async (postData) => {
const post = await postData();
// console.log("inside", post.frontmatter);
return { ...post.frontmatter, url: post.url };
});
return posts;
};
当我 console.log 帖子(在 rss.xml.js 中)时,我意识到
posts
不存在,因为 fetchFeed 函数调用尚未解析。它在调用 rss() 函数后解析。
我假设
await
关键字会延迟返回,直到它得到解决......但事实并非如此。
有人可以帮助我并指出我做错了什么吗?我不太擅长 Promise,希望得到一些帮助。
问候,
阿里姆
你的
posts
是一系列 Promise。你需要等待。
const posts = await Promise.all(Object.values(allPosts).map(async (postData) => {
const post = await postData();
// console.log("inside", post.frontmatter);
return { ...post.frontmatter, url: post.url };
}));
使用
promise.all
代码将是这样的:
export async function get(context) {
const postsPromises = await fetchFeed();
const posts = await Promise.all(postsPromises);
return rss({
title: "My Online Store",
description: "Online For Everyone",
site: context.site,
items: posts.map((post) => ({
title: post.title,
pubDate: Date.now(),
description: post.description,
link: post.url,
})),
});
}