从脚本调用端点失败并出现 TypeError [ERR_INVALID_URL]:无效 URL
Calling Endpoint from script fails with TypeError [ERR_INVALID_URL]: Invalid URL
我有这个脚本部分:
<script>
import Search from "$lib/search.svelte";
import ViewOptions from "$lib/views.svelte";
import { onMount } from "svelte";
let page;
let showData = {
shows: {},
loading: true,
};
export async function getData(page) {
const url = `/shows?page=${page}`;
console.log(url);
const res = await fetch(url);
const shows = await res.json();
showData = {
shows: shows,
loading: false,
};
}
onMount(async () => {
getData(page);
});
$: page, getData(page);
</script>
并且 onMount 工作正常。
如果我试图让它成为反应式的,意思是在页面变量改变时调用函数,我在控制台中得到这个错误:
node:internal/errors:464
ErrorCaptureStackTrace(err);
^
TypeError [ERR_INVALID_URL]: Invalid URL
at new NodeError (node:internal/errors:371:5)
at onParseError (node:internal/url:552:9)
at new URL (node:internal/url:628:5)
at new Request (file:///.../node_modules/@sveltejs/kit/dist/install-fetch.js:5907:16)
at file:///.../node_modules/@sveltejs/kit/dist/install-fetch.js:6189:19
at new Promise (<anonymous>)
at fetch (file:///.../node_modules/@sveltejs/kit/dist/install-fetch.js:6187:9)
at getData (/src/routes/index.svelte:23:21)
at eval (/src/routes/index.svelte:37:10)
at Object.$$render (/.../node_modules/svelte/internal/index.js:1745:22) {
input: '/shows?page=undefined',
code: 'ERR_INVALID_URL'
}
我不明白函数调用在 onMount 部分完美运行,但直接调用时却不行。看起来它找不到端点。如果我从服务器(模块部分)调用它,我会理解,但显然,我不会!
P.S.: 我也试过 $: getData(page)
SvelteKit 提供了一个 load
函数和一个 fetch
包装器,您可以使用它来调用您的内部 API。重构您的代码以使用它。你应该得到这样的结果:
<script context="module">
export async function load({ fetch }) {
const res = await fetch(`/shows?page=${page}`);
const shows = await res.json();
return {
props: { shows }
};
}
</script>
之后你可以做的事:
<script context="module">
/* Code above */
</script>
<script>
export let shows;
</script>
并且 shows
将与来自服务器的数据混合。
这里的问题是,加载函数是在客户端和服务器上计算的。在反应语句中,您必须检查浏览器上当前是否 运行 如下所示:
$: {if (browser) {getData(page);}}
我有这个脚本部分:
<script>
import Search from "$lib/search.svelte";
import ViewOptions from "$lib/views.svelte";
import { onMount } from "svelte";
let page;
let showData = {
shows: {},
loading: true,
};
export async function getData(page) {
const url = `/shows?page=${page}`;
console.log(url);
const res = await fetch(url);
const shows = await res.json();
showData = {
shows: shows,
loading: false,
};
}
onMount(async () => {
getData(page);
});
$: page, getData(page);
</script>
并且 onMount 工作正常。 如果我试图让它成为反应式的,意思是在页面变量改变时调用函数,我在控制台中得到这个错误:
node:internal/errors:464
ErrorCaptureStackTrace(err);
^
TypeError [ERR_INVALID_URL]: Invalid URL
at new NodeError (node:internal/errors:371:5)
at onParseError (node:internal/url:552:9)
at new URL (node:internal/url:628:5)
at new Request (file:///.../node_modules/@sveltejs/kit/dist/install-fetch.js:5907:16)
at file:///.../node_modules/@sveltejs/kit/dist/install-fetch.js:6189:19
at new Promise (<anonymous>)
at fetch (file:///.../node_modules/@sveltejs/kit/dist/install-fetch.js:6187:9)
at getData (/src/routes/index.svelte:23:21)
at eval (/src/routes/index.svelte:37:10)
at Object.$$render (/.../node_modules/svelte/internal/index.js:1745:22) {
input: '/shows?page=undefined',
code: 'ERR_INVALID_URL'
}
我不明白函数调用在 onMount 部分完美运行,但直接调用时却不行。看起来它找不到端点。如果我从服务器(模块部分)调用它,我会理解,但显然,我不会!
P.S.: 我也试过 $: getData(page)
SvelteKit 提供了一个 load
函数和一个 fetch
包装器,您可以使用它来调用您的内部 API。重构您的代码以使用它。你应该得到这样的结果:
<script context="module">
export async function load({ fetch }) {
const res = await fetch(`/shows?page=${page}`);
const shows = await res.json();
return {
props: { shows }
};
}
</script>
之后你可以做的事:
<script context="module">
/* Code above */
</script>
<script>
export let shows;
</script>
并且 shows
将与来自服务器的数据混合。
这里的问题是,加载函数是在客户端和服务器上计算的。在反应语句中,您必须检查浏览器上当前是否 运行 如下所示:
$: {if (browser) {getData(page);}}