如何在Stradi服务器上设置套接字连接

时间:2020-07-23 17:33:41

标签: socket.io strapi

我正在尝试将socket.io与trapi集成在一起。但是不幸的是,如果没有任何有关此方面的适当教程或文档,我将无法做到这一点。

我跟随着我在网上找到的唯一资源: https://medium.com/strapi/strapi-socket-io-a9c856e915a6 但是我认为这篇文章已经过时了。我似乎无法运行其中提到的代码而不会遇到大量错误。

以下是我尝试实现的尝试,我一直在尝试通过chrome websocket插件智能websocket客户端进行连接,但是尝试运行服务器时没有任何反应。

我完全处于黑暗中。任何帮助将不胜感激

module.exports = ()=> {
  // import socket io
  var io = require('socket.io')(strapi.server)
  console.log(strapi.server) //undefined
  // listen for user connection
  io.on('connect', socket => {
  
      socket.send('Hello!');
      console.log("idit")

      // or with emit() and custom event names
      socket.emit('greetings', 'Hey!', { 'ms': 'jane' }, Buffer.from([4, 3, 3, 1]));

      // handle the event sent with socket.send()
      socket.on('message', (data) => {
        console.log(data);
      });

      // handle the event sent with socket.emit()
      socket.on('salutations', (elem1, elem2, elem3) => {
        console.log(elem1, elem2, elem3);
      });
    });
};

2 个答案:

答案 0 :(得分:8)

所以我找到了解决方案。好极了。我把它放在这里,以防万一有人需要它。

boostrap.js

setFilter(entries.filter((key) => key.speak.includes("Afrikaans")));

https://github.com/strapi/strapi/issues/5869#issuecomment-619508153 _

找到了

显然,服务器启动时socket.server不可用。因此,您必须利用等待socket.server初始化的process.nextTick。

我还将添加一些设置时遇到的问题。

我如何从nuxt,vue等外部客户端进行连接或做出反应?

您只需通过“ http:// localhost:1337”进行连接,这是我通常使用的bandi地址。

我正在使用nuxt作为客户端,这就是在客户端设置我的socketio的方式

  1. 我首先通过npm安装了nuxt-socket-io
  2. 根据文档的内容编辑了nuxt.config文件
module.exports = async () => {
  process.nextTick(() =>{
    var io = require('socket.io')(strapi.server);
    io.on('connection', async function(socket) {

      console.log(`a user connected`)
      // send message on user connection
      socket.emit('hello', JSON.stringify({message: await strapi.services.profile.update({"posted_by"})}));


      // listen for user diconnect
      socket.on('disconnect', () =>{
        console.log('a user disconnected')
      });
    });
    strapi.io = io; // register socket io inside strapi main object to use it globally anywhere
  })

};
  1. 然后我终于在其中一个页面中添加了一个侦听器。
modules:[
  ...
  'nuxt-socket-io',
  ...
],
io: {
    // module options
    sockets: [
      {
        name: 'main',
        url: 'http://localhost:1337',
      },
    ],
  },

它有效。

答案 1 :(得分:0)

将第三方服务集成到 Strapi 的一种简洁方法是使用 hooks。它们在服务器引导期间加载一次。在这种情况下,我们将创建 a local hook

以下示例适用于 org.apache.fop.fo.expr.PropertyException: null:3:14496: No conversion defined #black; property:'color' at org.apache.fop.fo.properties.PropertyMaker.make(PropertyMaker.java:446) at org.apache.fop.fo.PropertyList.convertAttributeToProperty(PropertyList.java:499) at org.apache.fop.fo.PropertyList.addAttributesToList(PropertyList.java:386) at org.apache.fop.fo.FObj.processNode(FObj.java:127) at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:293) at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:179) at org.docx4j.org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1119) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at org.docx4j.org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:518) at org.docx4j.utils.XmlSerializerUtil.serialize(XmlSerializerUtil.java:51) at org.docx4j.utils.XmlSerializerUtil.serialize(XmlSerializerUtil.java:18) at org.docx4j.convert.out.fo.renderers.FORendererApacheFOP.render(FORendererApacheFOP.java:247) at org.docx4j.convert.out.fo.renderers.FORendererApacheFOP.render(FORendererApacheFOP.java:181) at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:168) at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:47) at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:81) at org.docx4j.Docx4J.toFO(Docx4J.java:712) at org.docx4j.Docx4J.toPDF(Docx4J.java:741)

  • strapi@3.6 处为 socket.io 创建一个钩子
./hooks/socket.io/index.js
  • 启用新钩子以便 Strapi 加载它 - module.exports = strapi => { return { async initialize() { const ioServer = require('socket.io')(strapi.server, { cors: { origin: process.env['FRONT_APP_URL'], methods: ['GET', 'POST'], /* ...other cors options */ } }) ioServer.on('connection', function(socket) { socket.emit('hello', `Welcome ${socket.id}`) }) /* HANDLE CLIENT SOCKET LOGIC HERE */ // store the server.io instance to global var to use elsewhere strapi.services.ioServer = ioServer }, } }
./config/hook.js

大功告成。您可以在 module.exports = { settings: { 'socket.io': { enabled: true, }, }, }; models' lifecycle hooks 内访问 websocket 服务器。

./config/functions/bootstrap.js
相关问题