Ich benutze jetzt Obsidian zum Schreiben und dachte mir, ich erstelle ein Obsidian-Plugin, um auf mein Discourse-Forum zu posten. Theoretisch ist das einfach zu machen, aber die Antwort auf meinen ersten Versuch war:
Access to fetch at 'http://localhost:4200/posts.json' from origin 'app://obsidian.md' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
Die Anfrage kommt vom Client, aber der Client ist das Gerät des Benutzers. Wenn ich das richtig verstehe, ist das sicher:
import DiscoursePlugin from "./main";
import { TFile } from "obsidian";
export async function publishToDiscourse(
plugin: DiscoursePlugin,
activeFile: TFile
): Promise<{ message: string }> {
try {
const content = await plugin.app.vault.read(activeFile);
const baseUrl = plugin.settings.baseUrl;
const apiKey = plugin.settings.apiKey;
const headers = new Headers({
"Content-Type": "application/json",
"Api-Key": apiKey,
"Api-Username": "scossar", // dies muss eine Einstellung sein
});
const body = JSON.stringify({
title: activeFile.name,
raw: content, // TODO: den Inhalt parsen, um interne Links zu korrigieren
category: 1, // dies muss eine Einstellung sein
});
// TODO: prüfen, ob die Notiz bereits veröffentlicht wurde
const url = `${baseUrl}/posts.json`;
const response = await fetch(url, { method: "POST", headers, body });
if (!response.ok) {
console.error("Fehler beim Veröffentlichen auf Discourse:", response.status);
return { message: "Fehler beim Veröffentlichen auf Discourse" };
}
const jsonResponse = await response.json();
// TODO: die Antwort verwenden, um eine discoursePostId-Dateieigenschaft hinzuzufügen
console.log(`jsonResponse: ${JSON.stringify(jsonResponse, null, 2)}`);
return { message: "success" };
} catch (error) {
console.error("Fehler beim Veröffentlichen auf Discourse:", error);
return { message: `Fehler: ${error.message}` };
}
}
Es ist möglich, dass es eine offensichtliche Umgehung gibt, die ich übersehe. Wenn nicht, gibt es irgendeine Möglichkeit, wie Discourse es zulassen könnte? Ein Obsidian-Discourse-Plugin scheint nützlich zu sein. (Eine richtige Implementierung wäre komplexer als das, was ich oben gepostet habe.)