我有一个sveltekit应用程序,其中我使用gunjs作为数据库与用户auth等. (这个错误问题在我添加gunjs auth之前不存在)

现在的问题是,当我使用vercel部署应用程序时,它会抛出这样的信息(500:REQ_SERVER_REQ):

`Unhandled Promise Rejection    {"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"Error: Cannot find module './lib/text-encoding'\nRequire stack:\n- /var/task/node_modules/gun/sea.js","reason":{"errorType":"Error","errorMessage":"Cannot find module './lib/text-encoding'\nRequire stack:\n- /var/task/node_modules/gun/sea.js","code":"MODULE_NOT_FOUND","requireStack":["/var/task/node_modules/gun/sea.js"],"stack":["Error: Cannot find module './lib/text-encoding'","Require stack:","- /var/task/node_modules/gun/sea.js","    at Module._resolveFilename (node:internal/modules/cjs/loader:1134:15)","    at Module._load (node:internal/modules/cjs/loader:975:27)","    at exports.b (/var/task/___vc/__launcher/chunk-5UAC7W5H.js:1:1033)","    at /var/task/___vc/__launcher/bridge-server-BGIDXK2J.js:1:1443","    at Function.Re (/var/task/___vc/__launcher/bridge-server-BGIDXK2J.js:1:1809)","    at e.<computed>.L._load (/var/task/___vc/__launcher/bridge-server-BGIDXK2J.js:1:1413)","    at Module.require (node:internal/modules/cjs/loader:1225:19)","    at require (node:internal/modules/helpers:177:18)","    at USE (/var/task/node_modules/gun/sea.js:5:17)","    at /var/task/node_modules/gun/sea.js:189:44"]},"promise":{},"stack":["Runtime.UnhandledPromiseRejection: Error: Cannot find module './lib/text-encoding'","Require stack:","- /var/task/node_modules/gun/sea.js","    at process.<anonymous> (file:///var/runtime/index.mjs:1276:17)","    at process.emit (node:events:529:35)","    at emit (node:internal/process/promises:149:20)","    at processPromiseRejections (node:internal/process/promises:283:27)","    at process.processTicksAndRejections (node:internal/process/task_queues:96:32)"]}`

当我用npm run dev美元在本地运行时,它就能工作 我的db init看起来像这样:

`import { writable } from 'svelte/store';
import Gun from "gun"
import "gun/sea"
import "gun/axe"

export const db = new Gun();
export const user = db.user().recall({sessionStorage: true}); 

export const username = writable('');

user.get('alias').on((v:string) => username.set(v))

db.on('auth', async() => {
const alias = await user.get('alias');
username.set(alias)
})`

当我查看node_modules/gun/lib文件夹时,文本编码模块是唯一一个有一个文件夹而不是. js模块文件的文件夹,在文件夹中有一个包含模块代码的index.js文件.但这不应该是问题

也许我用错误的方式创建DB...?

我试着安装文本编码模块,这只是导致更多的错误,我try 了不同的gunjs版本,没有改变,我固定的 node 版本18.20,也没有改变.

请帮助:/

编辑: 我还发现一个名为shin.js的不同库使用了文本编码模块,但通过require导入它,如果模块是文件,我认为这就不起作用了.

编辑2: sea.js文件还获取了包含require的模块,该模块的原始错误也来自... gunjs github上也有一个问题,关于这个相同的错误,但使用nextjs: issue

推荐答案

在查看了抛出的错误之后,我认为最简单的解决方案是通过在全局上传递实例来替换sea.js文件中的文本编码模块的初始化.变数...

我写了一个postinstall脚本,它只是替换了sea.js文件中的这些行:

const fs = require('fs');

const filePath = 'node_modules/gun/sea.js'; // Sea module to edit

const oldTextDecoder = 'api.TextDecoder = TextDecoder;';
const newTextDecoder = 'api.TextDecoder = global.TextDecoder;';
const oldTextEncoder = 'api.TextEncoder = TextEncoder;';
const newTextEncoder = 'api.TextEncoder = global.TextEncoder;';
const oldRequire = 'const { TextEncoder, TextDecoder }';
const newRequire = '//const { TextEncoder, TextDecoder }';

fs.readFile(filePath, 'utf8', (err, data) => {
  if (err) {
    console.error(err);
  } else {
    const modifiedContent = data.replace(oldTextDecoder, newTextDecoder)
                                .replace(oldTextEncoder, newTextEncoder)
                                .replace(oldRequire, newRequire);
    fs.writeFile(filePath, modifiedContent, 'utf8', (err) => {
      if (err) {
        console.error(err);
      } else {
        console.log('Replaced the text-encoder definition and imports with global instances.');
      }
    });
  }
});

我在user/auth脚本上传递全局实例: (+所有所需进口)

import Buffer from "buffer";
import pkg from 'text-encoding';
const {TextDecoder, TextEncoder} = pkg;
global.Buffer = global.Buffer || Buffer.Buffer;
global.TextEncoder = TextEncoder;
global.TextDecoder = TextDecoder;
import Gun from "gun/gun"
import "gun/sea"

Javascript相关问答推荐

如何修复内容安全策略指令脚本-SRC自身错误?

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

函数返回与输入对象具有相同键的对象

JSDoc创建并从另一个文件导入类型

使用POST请求时,Req.Body为空

rxjs插入延迟数据

在数组中查找重叠对象并仅返回那些重叠对象

根据一个条件,如何从处理过的数组中移除一项并将其移动到另一个数组?

如何在JAVASCRIPT中临时删除eventListener?

Vaadin定制组件-保持对javascrip变量的访问

警告框不显示包含HTML输入字段的总和

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

Clip-Path在网页浏览器(Mozilla、Edge、Chrome)上不能正常工作,但在预览版Visual Code Studio HTML、CSS、JS上却能很好地工作

不协调嵌入图片

为什么我的Navbar.css没有显示在本地主机页面上?

固定动态、self 调整的优先级队列

如何检测当前是否没有按下键盘上的键?

Played link-Initialize.js永远显示加载符号

ReactJS在类组件中更新上下文

material UI自动完成全宽