javascript - SvelteKit:500:模块“流”已被外部化以实现浏览器兼容性
问题描述
我正在尝试使用 WebKit 设置与 Firebase 的经过身份验证的连接。
从某种意义上说,下面的代码“有效”,我按预期从 Firebase 实时数据库接收数据。
index.svelte
<script context="module">
// import serviceAccount from '../private/my-firebase-private-key.json'
import { google } from 'googleapis'
let firebaseAccessToken
const serviceAccount = {
"type": "service_account",
"project_id": "my-test-project-xxxxxx",
"private_key_id": "0d33XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"private_key": "-----BEGIN PRIVATE KEY-----\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-----END PRIVATE KEY-----\n",
"client_email": "firebase-adminsdk-xxxxx@my-test-project-xxxxxx.iam.gserviceaccount.com",
"client_id": "9999999999999999999999",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-xxxxxx%40my-test-project-xxxxxx.iam.gserviceaccount.com"
}
async function firebaseAuth() {
let scopes = [
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/firebase.database',
]
let jwtClient = new google.auth.JWT(
serviceAccount.client_email,
null,
serviceAccount.private_key,
scopes
)
return new Promise((
resolve,
reject
) =>
jwtClient.authorize((error, tokens) => {
if (error) {
console.log('Error making request to generate access token:', error)
reject(error)
} else if (tokens.access_token === null) {
console.log(
'Provided service account does not have permission to generate access tokens'
)
reject(error)
} else {
firebaseAccessToken = tokens.access_token
resolve(tokens.access_token)
}
})
)
}
// export async function load({ page, fetch, session, context }) {
export async function load({ fetch }) {
await firebaseAuth()
// console.log(`firebaseAccessToken: ${firebaseAccessToken}`)
const res = await fetch(
'https://myfirebasedatabase.app/jsondb.json',
{
headers: { 'Authorization': `Bearer ${firebaseAccessToken}` },
}
)
const data = await res.json()
if (!res.ok) {
return {
status: res.status,
error: new Error('Could not fetch data'),
}
}
return { props: { myData : data } } <-- DATA is RECEIVED
}
</script>
<script>
export let myData
onMount(() => {
console.log(myData) <---------------- NEVER EXECUTED
})
</script>
问题是 UI 显示以下错误...
500: Module "stream" has been externalized for browser compatibility and cannot be accessed in client code.
... 由该__error.svelte
文件处理
<script context="module">
export function load({ error, status }) {
return {
props: {
title: `${status}: ${error.message}`
}
};
}
</script>
<script>
export let title;
</script>
<h1>{title}</h1>
我觉得它与 Vite 或其他配置有关,但我对 svelte 的经验太少,无法确定。你以前有过这种错误吗?
谢谢你的帮助。
解决方案
我有同样的错误只写了这行代码
import { google } from 'googleapis'
得到相同的错误500。
但是当在 svelte.config.js 文件中为 vite 服务器添加这个配置时
//svelte.config.js
vite: {
optimizeDeps: {
exclude: ['googleapis']
}
}
得到这个错误:
The requested module '/node_modules/googleapis/build/src/index.js?v=9d844668' does not provide an export named 'google'
我在浏览器/devtools 网络选项中看到,当我使用排除时 index.js 文件的大小为 70 Kb,但当使用包含时,大小为 46 Mb。
我认为 vite 服务器尝试在客户端的 webbrowser 中加载 node_modules 纯粹是错误。
如果我找到此错误的解决方案,请务必分享解决方案
问候!。
推荐阅读
- gitlab - 是否可以在 gitlab 中覆盖 $CI_PROJECT_NAME ?
- c# - 为什么 Regex.Replace 给我最后一组奇怪的结果
- laravel - 无法在网络上加载徽标
- regex - 将正则表达式搜索合并为一个匹配项
- django-rest-framework - 如何在 Django-REST 中使用 ListField 字段发出 PUT/PATCH 请求?
- r - RStudio --> 错误:找不到 Python 模块 tensorflow.keras
- excel - 本月的下一个第 n 天 - excel
- json - DJANGO REST - 基于类的视图 - POST、GET 请求不按定义工作
- angular - Angular e2e 量角器 browser.wait 不起作用
- python - 如何更改 KivyMD 中 MDFloatingActionButtonSpeedDial 中的锚值?