我有一个API(位于/src/routes/api/bell/+server.ts
),它返回一个随机音频文件作为base64。
我的音频文件位于/src/lib/audio
(我也尝试过/src/lib/sever/audio
)。
我使用raddirSync
和readFileSync
从fs
读取并返回一个随机文件。在代码:
export const GET = (async () => {
const files = fs.readdirSync('$lib/audio');
const randomFile = files.at(Math.floor(Math.random() * files.length));
const audioBase64 = fs.readFileSync('$lib/audio/' + randomFile, { encoding: 'base64' });
return json(audioBase64);
}) satisfies RequestHandler;
我现在正在尝试使用' adapter-node '进行部署。
运行' node build '并触发API抛出
Error: ENOENT: no such file or directory, scandir '$lib/server/audio'
.
我试着:
将音频文件的位置更改为:
的构建中。/src/lib/sever/audio
。这样,它们至少看起来包含在.svelte-kit/output/server/_app/immutable/assets/[name].mp3
Using vites
import.meta.glob
。这样我就可以得到随机路径,但我不知道如何在不使用fs
的情况下返回文件。使用
import '[filename]?raw'
导入音频文件并将其转换为base64。我没有尝试过这个,但我找到了关于这个的线程,它似乎不工作,不适合我的情况,我可能不知道目录中的所有文件。
有谁知道为什么fs不工作或如何'vite only'解决方案看起来像?
如果其他人有这个问题,这是我的工作。
我有我的文件在/src
目录,但似乎SvelteKit希望你把文件,如音频和图像在/static
目录。
在你的代码中你甚至不需要像/static/img/waveform.svg
那样引用它你只需要输入/img/waveform.svg
旧答案
好了,我想我找到解决办法了。
在vite的客户端上使用fs
是不允许的(逻辑上),在服务器上是可能的(我认为这可能是一个问题,但只是为了摆脱它,它不是,vite甚至在一些例子中使用fs)。
但是在构建时,vite向文件添加了一些散列,因此fs
无法找到它们。
我把我的音频目录添加到我的vite.config.ts:
export default defineConfig({
plugins: [sveltekit()],
build: {
rollupOptions: {
output: {
assetFileNames: '$lib/audio/[name][Extension]'
}
}
}
});
我仍然不确定vite现在把它们放在哪里以及fs
如何处理路径,因为这仍在变化,就像位于_app/immutable
的图像一样。我猜有一个映射在后台使用。
所以如果有人知道更多关于一个完成的构建,我仍然很感兴趣。
UPDATE # 1:
没有工作,因为sveltekit覆盖了它。即使我在svelte.config.ts中添加了vite配置,它似乎也会这样做。我现在有了一个使用vitesimport.meta.glob
的解决方案。不幸的是,我最终得到的路径不再是相对的了。
我打算明天发布一个代码片段。(我还在计划这件事,只是没有时间)