首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sapper中的Websockets

Sapper中的Websockets
EN

Stack Overflow用户
提问于 2020-08-07 14:36:25
回答 1查看 1K关注 0票数 3

我在Svelte中有一个可读的存储,如下所示:

代码语言:javascript
复制
const state = {};
export const channels = readable(state, set => {
        let st = state;
        let socket = new WebSocket("ws://127.0.0.1:5999");
    
        socket.onmessage = function (event) {
          var datastr = event.data.split(':');
          st[datastr[0]].value = datastr[1];
          st[datastr[0]].timestamp = Date.now();
                    set(st)
        };
          return () => {
                    socket.close()
                }
    
});

当我将它导入我的Svelte应用程序时,它就起作用了。但是如果我把这个App.svelte作为我的index.svelte运行在Sapper上,它一开始就不能工作了。它显示未定义错误500 websocket。一旦我在浏览器中重新加载页面开始工作...我尝试解析一个创建商店的函数:

代码语言:javascript
复制
export const getChannel = () => {
 // here my store
return {...store}
}

然后在onMount()中创建存储,如下所示:

代码语言:javascript
复制
onMount( ()=> {
    const channel = getChannel();
});

但似乎没有起到作用..。我错过了什么?注意:如果只需用一个简单的可写对象替换存储,并创建websocket onMount(),它就可以正常工作。我只是想把商店里所有的沟通都作为一个可读的……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-12 10:44:19

在Sapper中,组件中的代码(或导入到组件中的代码)在服务器端渲染期间在Node中执行,除非它被放入onMount (它不会在服务器上运行,因为没有“挂载”发生)或if (process.browser) {...}块,或者其他类似的东西。

这包括对$channels的引用,这会导致在初始化期间调用channels.subscribe(...)

由于Node中没有全局WebSocket,因此创建订阅将失败。最简单的解决方法可能是简单的功能检查:

代码语言:javascript
复制
const state = {};
export const channels = readable(state, (set) => {
  if (typeof WebSocket === 'undefined') return;

  let st = state;
  let socket = new WebSocket("ws://127.0.0.1:5999");

  socket.onmessage = function (event) {
    var datastr = event.data.split(":");
    st[datastr[0]].value = datastr[1];
    st[datastr[0]].timestamp = Date.now();
    set(st);
  };
  return () => {
    socket.close();
  };
});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63296482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档