
Sprog 🇩🇰 Dansk
Val Town Installation
Afstemninger
Tilføj live-kommentarer til Val Town-apps
Val Town kører TypeScript på Deno, så en val er en rigtig server. Det gør den velegnet til FastComments: widget'en er et script‑tag på siden, og alt der har brug for en hemmelighed, som Secure SSO eller verifikation af en webhook, kan køre server‑side i den samme val.
Denne guide dækker, hvordan du tilføjer kommentarswidget'en til en HTTP‑val, viser kommentarantal på en indeks‑side, logger brugere ind med den Val Town‑konto, de allerede har, og modtager kommentar‑webhooks.
Du behøver ikke en konto for at prøve det. Eksemplerne bruger tenantId: "demo", en delt sandbox, og trin 2 dækker, hvordan du skifter til din egen.
Trin 1: Tilføj widgeten 
The widget er et script‑tag og et container‑element, så den falder ind i hvad din val allerede rendererer. Dette eksempel bruger Hono JSX, som er hvad Val Towns HTTP‑skabeloner bruger.
Run 
Vælg et urlId før du udgiver
urlId bestemmer, hvilken tråd en kommentar lander i. Lad den stå uindstillet, så falder den tilbage på en renset version af den aktuelle side‑URL, hvilket er præcis det, der ændrer sig på Val Town: en val har et langt *.web.val.run‑hostname indtil du gør krav på et subdomæne, grene får deres egne URL’er, og omdøbning af en side ændrer stien. Hver variation bliver stiltiende en separat, tom tråd, og symptomet læses som “mine kommentarer forsvandt”.
Sæt den til noget stabilt, som du kontrollerer, f.eks. post‑slug’en eller en database‑id, som ovenfor. Send også url med, så notifikations‑e‑mails og moderationsværktøjerne kan linke tilbage til den rigtige side.
Bevare kommentarer uden JavaScript
FastComments rendererer en fuld tråd på server‑siden, som en val kan placere i en <noscript>‑blok:
Run 
URL‑kod de parametre. Server‑side‑versionen understøtter anonyme og loggede kommentarer, SSO og indlejrede svar.
Trin 2: Brug din egen konto 
tenantId: "demo" er en delt offentlig sandbox. Den fungerer uden tilmelding, hvilket er grunden til at eksemplerne bruger den, men alle andre der prøver FastComments skriver i de samme tråde, og enhver kan moderere dem. Skift, før du publicerer noget, du har brug for.
Din tenant‑ID er på API‑hemmelighedssiden.
Et tenant‑ID er offentligt og hører hjemme i browserkoden. En API‑hemmelighed gør det ikke, og intet på denne side kræver en.
Læs den fra en miljøvariabel
Val Town‑værdier er offentlige på den gratis plan, så deres kilde er læsbar for alle. Gem alt følsomt i miljøvariabler, læs med Deno.env.get:
Run 
Dette er vigtigere end normalt på Val Town af en anden grund: remixing af en val kopierer miljøvariabel‑nøgler, men ikke deres værdier. En hemmelighed gemt i en miljøvariabel følger ikke din val ind i en andens konto. En hemmelighed skrevet i en fil gør.
At falde tilbage til "demo" holder val’en i funktion for enhver, der remixer den, før de indstiller deres egen tenant.
EU‑konti
En konto, dens data og dens nøgler lever i én region. Hvis din blev oprettet på eu.fastcomments.com, skal hver widget‑konfiguration også have region: "eu", og scriptet indlæses fra cdn-eu.fastcomments.com. Ellers lad begge være uændrede.
Kommentarantal på en indeks-side 
På en indeksside skal du ikke gengive én comment-count-widget pr. række. Det er én anmodning pr. opslag. Brug bulk-tællingen, som tager en enkelt anmodning for hele siden.
Markér hver række med den urlId, dens tråd bruger, og indlæs derefter bulk-widgetten én gang:
Run 
Scriptet finder hvert .fast-comments-count-element på siden og udfylder dets tælling.
data-fast-comments-url-id skal matche den urlId, som opslagets kommentarwidget bruger. Hvis widgetten bruger slug'en, bruger markøren slug'en. En uoverensstemmelse viser nul på en tråd, der har kommentarer.
Scriptet poller efter window.FastCommentsBulkCountConfig, så det er ligegyldigt, om du angiver konfigurationen før eller efter script-tagget.
Sikre SSO med std/oauth 
Hvis din val allerede ved, hvem den besøgende er, giver Secure SSO denne identitet videre til widget'en, så de aldrig ser en anden login. Der er ingen endpoints at bygge og intet at kalde ved runtime: du beregner tre værdier server-side og sender dem med i widget-konfigurationen.
Val Town leverer zero-config login med std/oauth, så den besøgende kan logge ind med den Val Town-konto, de allerede har. Udskift det med, hvad din app nu bruger; FastComments-delen ændres ikke.
Byg payload'en på serveren
API-secret'en signerer payload'en og må aldrig nå browser-koden. Installer SDK'en fra npm, som virker på Val Towns Deno-runtime som den er:
Run 
getPayload() returnerer { userDataJSONBase64, verificationHash, timestamp }. Det er de tre værdier, der når browseren. Secret'en signerer dem og smides derefter væk, så intet på siden gør det muligt for en læser at forfalske en anden bruger.
Send det til widget'en
Run 
oauthMiddleware tilføjer GET /auth/login, GET /auth/callback og POST /auth/logout for dig. Bemærk, at logout er en POST, mens widget'en navigerer til logoutURL med en GET, så peg logoutURL på en lille route hos dig selv, som sender POST'en.
Når den besøgende er logget ud, sendes sso med kun en loginURL. Widget'en viser så en login-prompt i stedet for en anonym kommentarboks.
Ting der går galt
timestamp er i epoch-millisekunder, må ikke ligge i fremtiden og må ikke være mere end to dage gammel. Generér den på serveren i samme request, som beregner hashen. At generere den i browseren er den klassiske fejl: værdien afviger fra den, der blev hashet, og hver kommentar afvises.
Sæt aldrig isAdmin eller isModerator ud fra identitetsudbyderen. At logge ind med en Val Town-konto siger intet om, hvem der bør moderere dit site.
Se SSO-guiden for den fulde feltliste, gruppebegrænsede tråde og badges.
Modtag webhooks 
En val er en naturlig webhook-modtager: den har en stabil URL, den kan verificere en signatur, og den har SQLite og blob-lagring indbygget.
FastComments signerer ${timestamp}.${body} med din kontos API-hemmelighed og sender to headers:
Run 
Metoden bærer hændelsen: PUT for en oprettet eller opdateret kommentar, DELETE for en slettet.
Run 
To ting der bider
Verificer de rå bytes. Parsing af JSON og gen-serialisering ændrer nøgleordren og mellemrum, så hash'en er forskellig, og hver levering fejler uden en åbenlys årsag. Dette er den sædvanlige grund til, at en webhook-modtager "bare ikke virker".
Sammenlign i konstant tid. En simpel === på signaturen lækker hvor mange bytes der matchede, hvilket er nok til at forfalske en byte ad gangen.
Håndtering af hændelser
Svar hurtigt. FastComments forsøger igen ved et svar, der ikke er 2xx, og et endpoint, der fortsat fejler, deaktiveres til sidst automatisk, så udfør reelt arbejde efter at have svaret i stedet for inline.
Gør arbejdet idempotent på kommentar-id'et. Et retry bliver gen-signeret med en frisk tidsstempel, og det samme kommentar-id ankommer igen ved redigering og sletning, så der er intet stabilt at deduplere på.
Eksempel Vals 
Fire offentlige vals, du kan remixe, som hver især dækker en del af denne guide.
Blog med kommentarer (live) er en Markdown-blog med en tråd under hvert opslag og samlede kommentartællinger på indekssiden. Den virker, så snart du remixer den, og én miljøvariabel peger den på din egen konto.
SSO-demo (live) logger besøgende ind med deres Val Town-konto og giver denne identitet videre til widgetten, så der ikke er behov for et andet login.
Webhook-modtager (live) verificerer HMAC-signaturen ved hver levering og gemmer events i SQLite. Den har en knap, der signerer en test-payload og leverer den til sig selv, så du kan se verifikationen lykkes, før du konfigurerer en rigtig webhook.
Agent skills (live) er et bibliotek af FastComments agent skills, der dækker widgetten, SSO, REST API'et, moderation og migrering væk fra Disqus. Remix den, og Val Towns agent, Townie, henter automatisk skills fra skills/, så din agent ved, hvordan man sætter kommentarer op, uden at du skal indsætte dokumentation i chatten.
De samme skills kan installeres andre steder med npx skills add fastcomments/skills.
Domænefejl 
Når du slår demo-tenanten fra, kan widgetten nægte at indlæse med en autorisationsfejl. Det skyldes, at FastComments ikke ved, at din konto skal have lov til at blive brugt på det domæne.
Gå hertil for at tilføje dit site til din konto.
Val Town er et andet blik værd her, fordi en val kan være tilgængelig på mere end ét hostname:
- Hver HTTP-val har et langt standardendpoint,
<org>--<id>.web.val.run. - At gøre krav på et brugerdefineret subdomæne tilføjer
<name>.val.run. - Et brugerdefineret domæne tilføjer et tredje.
- Branches får deres egne URL'er.
Tilføj de hostnames, du faktisk serverer widgetten fra. Hvis du gør krav på et subdomæne, efter du har sat tingene op, så tilføj det også, ellers virker widgetten på den gamle URL og fejler på den nye.
Tilføj afstemninger til din Val Town-app 
Når FastComments er på din Val Town-app, kan du også køre live‑afstemninger direkte i kommentarerne. Slå Enable Polls til i dine widget‑tilpasningsindstillinger, så vises en afstemningsknap i kommentarværktøjslinjen. Afstemninger kan have 2 til 10 muligheder, resultater opdateres live for alle på siden, og du kan vælge, hvem der kan oprette afstemninger, og om afstemning kræver login. Der er intet andet at installere på Val Town.
Prøv Live Polls‑demoen eller læs Polls‑dokumentationen for at sætte dem op.