组件中未定义渲染函数或模板:匿名

Vla*_*nin 5 socket.io vue.js nuxt.js

我遇到这样的问题,重新加载页面后出现错误。“组件中未定义渲染函数或模板:匿名”。我认为该错误是由于 socket.io 造成的。\n这个错误不是发生在本地机器上,而是发生在生产上,这是怎么回事?dev \xd0\xb2\xd0\xb5\xd1\x80\xd1\x81\xd0\xb8\xd1\x8f 错误

\n\n

服务器.js

\n\n

\r\n
\r\n
const APP_ENV = require(\'./.env.js\')\r\nconst { Nuxt, Builder } = require(\'nuxt\')\r\nconst app = require(\'express\')()\r\nlet server = require(\'http\').Server(app)\r\n\r\nif(APP_ENV.ssl) {\r\n  const fs = require(\'fs\')\r\n  const options = {\r\n    key: fs.readFileSync(APP_ENV.ssl_key),\r\n    cert: fs.readFileSync(APP_ENV.ssl_cert)\r\n  }\r\n  server = require(\'https\').Server(options, app)\r\n}\r\n\r\nconst port = process.env.PORT || APP_ENV.ws_port\r\nconst isProd = process.env.NODE_ENV === \'production\'\r\n\r\n// We instantiate Nuxt.js with the options\r\nlet config = require(\'./nuxt.config.js\')\r\nconfig.dev = !isProd\r\n\r\nconst nuxt = new Nuxt(config)\r\n// Start build process in dev mode\r\nif (config.dev) {\r\n  const builder = new Builder(nuxt)\r\n  builder.build()\r\n}\r\napp.use(nuxt.render)\r\nif (APP_ENV.socket) {\r\n  const io = require(\'socket.io\')(server)\r\n  const Redis = require(\'ioredis\')\r\n  const redis = new Redis(APP_ENV.redis.port, APP_ENV.redis.host)\r\n  redis.psubscribe([\'*\'])\r\n  redis.on(\'pmessage\', function (subscribe, channel, message) {\r\n    message = JSON.parse(message)\r\n    console.log(\'Server: \', subscribe, channel, message.data.message)\r\n    io.emit(channel + \':\' + message.event, message.data)\r\n  })\r\n\r\n  // io.on(\'connection\', function (socket) {\r\n  // })\r\n}\r\n\r\nserver.listen(port, function () {\r\n  console.log(\'Listening on Port \' + port)\r\n})
Run Code Online (Sandbox Code Playgroud)\r\n
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

插件/socket.io.js\n

\r\n
\r\n
``\r\n\r\nimport io from \'socket.io-client\'\r\n\r\nconst socket = io(process.env.WS_URL)\r\n\r\nexport default socket
Run Code Online (Sandbox Code Playgroud)\r\n
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

io/index.js

\n\n

\r\n
\r\n
module.exports = function () {\r\n  const APP_ENV = require(\'../.env.js\')\r\n  const server = require(\'http\').createServer(this.nuxt.renderer.app)\r\n\r\n  // overwrite nuxt.listen()\r\n  this.nuxt.listen = (port, host) => new Promise((resolve) => server.listen(port || 3000, host || \'localhost\', resolve))\r\n  // close this server on \'close\' event\r\n  this.nuxt.hook(\'close\', () => new Promise((resolve) => server.close(resolve)))\r\n\r\n  // Add `socket.io-client` in vendor\r\n  this.addVendor(\'socket.io-client\')\r\n\r\n  if (APP_ENV.socket) {\r\n    const io = require(\'socket.io\')(server)\r\n    const Redis = require(\'ioredis\')\r\n    const redis = new Redis(APP_ENV.redis.port, APP_ENV.redis.host)\r\n    redis.psubscribe([\'*\'])\r\n    redis.on(\'pmessage\', function (subscribe, channel, message) {\r\n      message = JSON.parse(message)\r\n      console.log(\'Server: \', subscribe, channel, message.data.message)\r\n      io.emit(channel + \':\' + message.event, message.data)\r\n    })\r\n\r\n    // io.on(\'connection\', function (socket) {\r\n    // })\r\n  }\r\n}
Run Code Online (Sandbox Code Playgroud)\r\n
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

消息/index.vue

\n\n

\r\n
\r\n
<template>\r\n  <div class="my-messages">\r\n    <div class="container">\r\n      <div class="row">\r\n        <div class="col">\r\n          <h3>\xd0\x9c\xd0\xbe\xd0\xb8 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f</h3>\r\n        </div>\r\n      </div>\r\n      <div class="row">\r\n        <div class="col">\r\n          <div class="chat-wrap">\r\n            <div class="chat-tabs__content active">\r\n              <div class="chat-tabs">\r\n                <!--<div class="chat-tabs__item active">\xd0\x92\xd1\x85\xd0\xbe\xd0\xb4\xd1\x8f\xd1\x89\xd0\xb8\xd0\xb5 <span v-if="userMessage.count > 0">{{ userMessage.count }}</span></div>-->\r\n                <!--<div class="chat-tabs__item">\xd0\xa1\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd0\xbd\xd1\x8b\xd0\xb5-->\r\n                  <div v-for="(tab,index) in tabs" :key="index">\r\n                    <div class="chat-tabs__item" @click="changeTab(index)" :class="{\'chat-tabs__item active\': tab.active}">{{tab.title}}\r\n                  </div>\r\n                  <!-- <span>1</span> -->\r\n                </div>\r\n              </div>\r\n              <div class="chats-list">\r\n                <div class="chats-list__body" data-simplebar >\r\n                  <div class="">\r\n\r\n                    <div class="chat-item" v-if="user.name != \'\xd0\xa1\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd0\xbd\xd1\x8b\xd0\xb5\' && tabs.incoming.active" @click.stop="chengeTab(index, user.id)" :class="{ active: tabUsers[index] }" v-for="(user, index) in userMessage.users" :key="index">\r\n                      <div class="chat-item__ava">\r\n                        <img v-if="user.user_avatar_path" :src="baseUrl + \'items-original/\' + user.user_avatar_path" :alt="user.name">\r\n                        <span v-else>{{ user.name[0] | uppercase }}{{ user.name[1] | uppercase }}</span>\r\n                        <div v-if="user.unread > 0" class="chat-item__new-messages">{{ user.unread }}</div>\r\n                      </div>\r\n                      <div class="chat-item__interlocutor">\r\n                        {{ user.name }}\r\n                      </div>\r\n                      <!--<div class="chat-item__last-messages" v-html="user.message">-->\r\n                      <!--</div>-->\r\n                      <div class="chat-item__data">\r\n                        <!-- 13:25 -->\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div v-if="!chat_mob" class="chats">\r\n                <div class="chat-body active">\r\n                  <div class="chat">\r\n                    <div class="chat__header">\r\n                      <div class="chat__interlocutor">\r\n                        <div  class="chat-back" @click="chatBack">\r\n                          <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r\n                               width="14.617px" height="8px" viewBox="0 0 14.617 8" style="enable-background:new 0 0 14.617 8;" xml:space="preserve">\r\n                              <path style="fill:#DDE1E6;" d="M10.585,5.447c-0.85,0-1.7,0.013-2.549-0.003C6.603,5.418,6.419,5.531,6.489,6.973\r\n                            c0.008,0.158-0.011,0.312-0.052,0.468C6.303,7.95,5.766,8.159,5.32,7.867C4.009,7.009,2.699,6.15,1.388,5.291\r\n                            c-0.321-0.21-0.65-0.41-0.966-0.628C-0.131,4.282-0.146,3.7,0.41,3.332C2.011,2.271,3.626,1.23,5.23,0.171\r\n                            C5.909-0.278,6.516,0.224,6.49,0.896C6.48,1.153,6.489,1.41,6.489,1.667c0,0.58,0.288,0.871,0.864,0.871c2.135,0,4.269,0,6.404,0\r\n                            c0.573,0,0.859,0.291,0.86,0.876c0,0.415,0.003,0.83-0.001,1.245c-0.004,0.475-0.322,0.787-0.798,0.788\r\n                            C12.74,5.447,11.663,5.447,10.585,5.447z"/>\r\n                          </svg>\r\n                        </div>\r\n                        <div v-if="chatUser && (chatUser.name != \'\xd0\xa1\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd0\xbd\xd1\x8b\xd0\xb5\' && tabs.incoming.active )">{{ chatUser.name }}</div>\r\n                      </div>\r\n                      <!-- <div class="chat__actions">\r\n                        <div class="chat-menu">\r\n                          <div class="chat-menu__icon" @click.prevent="show = !show">\r\n                            <svg class="icon-svg icon-svg-header-chat-menu"><use xlink:href="/img/sprite.svg#header-chat-menu"></use></svg>\r\n                          </div>\r\n                          <ul class="chat-menu__dropdown" :class="{ show: show }">\r\n                            <li>\r\n                              \xd0\x9e\xd1\x82\xd0\xba\xd0\xbb\xd1\x8e\xd1\x87\xd0\xb8\xd1\x82\xd1\x8c \xd1\x83\xd0\xb2\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f\r\n                            </li>\r\n                            <li>\r\n                              \xd0\x9e\xd1\x87\xd0\xb8\xd1\x81\xd1\x82\xd0\xb8\xd1\x82\xd1\x8c \xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd1\x80\xd0\xb8\xd1\x8e\r\n                            </li>\r\n                            <li>\r\n                              \xd0\x97\xd0\xb0\xd0\xb1\xd0\xbb\xd0\xbe\xd0\xba\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd1\x8c \xd0\xba\xd0\xbe\xd0\xbd\xd1\x82\xd0\xb0\xd0\xba\xd1\x82\r\n                            </li>\r\n                          </ul>\r\n                        </div>\r\n                      </div> -->\r\n                    </div>\r\n                    <div class="chat__body" data-simplebar ref="chatBody">\r\n                      <!-- <pre>\r\n                        {{\r\n                          chatMessage\r\n                        }}\r\n                      </pre> -->\r\n                      <div id="message-container" v-if="chatMessage !== []">\r\n                        <div class="message_wrapper" v-if="checkMessage(message.sender_id) && (message.sender_id != null && tabs.incoming.active)" v-for="(message, index) in chatMessage" :key="index">\r\n                          <div class="message"  :class="{ \'message--to\': userCurrent.id === message.sender_id, \'message--from\': userCurrent.id !== message.sender_id }">\r\n                            <div class="message__post-data"></div>\r\n\r\n                            <div class="chat-item__ava message__ava" v-if="userByIdMessage(message.sender_id)" >\r\n                              <img v-if="userByIdMessage(message.sender_id).user_avatar_path !== null" :src="baseUrl + \'items-original/\' + userByIdMessage(message.sender_id).user_avatar_path" alt="" class="">\r\n                              <div v-else >\r\n                                <span>{{ userByIdMessage(message.sender_id).name[0] | uppercase }}{{ userByIdMessage(message.sender_id).name[1] | uppercase }}</span>\r\n                              </div>\r\n                            </div>\r\n                            <div class="chat-item__ava message__ava" v-else>\r\n                              <img v-if="userCurrent.user_avatar_path !== null" :src="baseUrl + \'items-original/\' + userCurrent.user_avatar_path" alt="" class="">\r\n                              <div v-else>\r\n                                <span>{{ userCurrent.user_name[0] | uppercase }}{{ userCurrent.user_name[1] | uppercase }}</span>\r\n                              </div>\r\n                            </div>\r\n                            <div class="message__text" v-html="message.message" >\r\n                            </div>\r\n                          </div>\r\n                          <div class="chat-item__last-messages" :class="{ \'created_time_to\': userCurrent.id === message.sender_id, \'created_time_from\': userCurrent.id !== message.sender_id }">{{message.created_at}}</div>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                    <form class="chat__form">\r\n                      <textarea placeholder="\xd0\x92\xd0\xb2\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x82\xd0\xb5 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5..." @keyup.ctrl.enter="onSendMessage" v-model="message"></textarea>\r\n                      <div v-html="img"></div>\r\n                      <div class="chat__form-controls">\r\n                        <div class="add-additions">\r\n                          <label class="message_img" for="image"><img src="/img/affix.svg" alt=""></label>\r\n                          <input class="img_input" id="image" type="file" accept="image/png, image/jpeg, image/gif, image/jpg" @change="uploadImg($event)">\r\n                        </div>\r\n                        <button @click.prevent="onSendMessage" >\r\n                          <img src="/img/telega.svg" alt="">\r\n                        </button>\r\n                      </div>\r\n                    </form>\r\n                  </div>\r\n                  <div class="interlocutor" v-if="chatUser">\r\n                    <img\r\n                      v-if="chatUser.user_avatar_path"\r\n                      :src="baseUrl + \'items-original/\' + chatUser.user_avatar_path"\r\n                      :alt="chatUser.name"\r\n                      class="interlocutor__img">\r\n                    <img v-else\r\n                         src="/img/avatar.svg"\r\n                         :alt="chatUser.name"\r\n                         class="interlocutor__img default_ava">\r\n\r\n                    <div class="interlocutor__title">\r\n                      {{ chatUser.name }}\r\n                    </div>\r\n                    <!--<ul class="interlocutor__info">-->\r\n                      <!--<li>-->\r\n                        <!--<span>-->\r\n                          <!--<img src="/img/marker-icon.svg" alt="">-->\r\n                        <!--</span>-->\r\n                        <!--115280, \xd0\x9c\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0,-->\r\n                        <!--\xd1\x83\xd0\xbb. \xd0\x9b\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xbd\xd1\x81\xd0\xba\xd0\xb0\xd1\x8f \xd1\x81\xd0\xbb\xd0\xbe\xd0\xb1\xd0\xbe\xd0\xb4\xd0\xb0, \xd0\xb4. 19-->\r\n                      <!--</li>-->\r\n                    <!--</ul>-->\r\n                    <!--<p class="interlocutor__text">-->\r\n                      <!--\xd0\x9d\xd0\xb0 \xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\xd0\xb5 5 \xd0\xbc\xd0\xb8\xd0\xbd., \xd0\xb2\xd1\x8b\xd1\x81\xd1\x82\xd0\xb0\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xbd\xd0\xbe-->\r\n                      <!--10 \xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb2. \xd0\x92\xd1\x80\xd0\xb5\xd0\xbc\xd1\x8f \xd1\x81 \xd0\xbc\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x82\xd0\xb0 \xd1\x80\xd0\xb5\xd0\xb3\xd0\xb8\xd1\x81\xd1\x82\xd1\x80\xd0\xb0\xd1\x86\xd0\xb8\xd0\xb8 3 \xd0\xbc\xd0\xb5\xd1\x81\xd1\x8f\xd1\x86\xd0\xb0.-->\r\n                    <!--</p>-->\r\n                    <!--<a href="#" class="btn btn&#45;&#45;xl btn&#45;&#45;border">-->\r\n                      <!--\xd0\x9f\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb9\xd1\x82\xd0\xb8 \xd0\xba \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb7\xd1\x83-->\r\n                    <!--</a>-->\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <!--<div class="container" v-else>-->\r\n      <!--<div class="row">-->\r\n        <!--<div class="col">-->\r\n          <!--<h3>\xd0\xa1\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb9 \xd0\xbd\xd0\xb5\xd1\x82</h3>-->\r\n        <!--</div>-->\r\n      <!--</div>-->\r\n    <!--</div>-->\r\n  </div>\r\n</template>\r\n<script>\r\n  const DOMAIN = process.env.API_DOMAIN\r\n\r\n  import socket from \'@/plugins/socket.io\'\r\n  import { mapActions, mapGetters } from \'vuex\'\r\n  import api from \'@/api\'\r\n\r\n  export default {\r\n    middleware: \'authenticated\',\r\n    data () {\r\n      return {\r\n        chat_mob: false,\r\n        contacts: true,\r\n        tabs: {\r\n          incoming: {\r\n            active: true,\r\n            title: \'\xd0\x92\xd1\x85\xd0\xbe\xd0\xb4\xd1\x8f\xd1\x89\xd0\xb8\xd0\xb5\'\r\n          },\r\n          systemic: {\r\n            active: false,\r\n            title: \'\xd0\xa1\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd0\xbd\xd1\x8b\xd0\xb5\'\r\n          }\r\n        },\r\n        virtualUser: false,\r\n        baseUrl: DOMAIN,\r\n        show: false,\r\n        tabUsers: [],\r\n        chatUser: null,\r\n        message: \'\',\r\n        userId: null,\r\n        test: null,\r\n        img: \'\',\r\n        check: false\r\n      }\r\n    },\r\n    beforeMount () {\r\n      this.getUserMessage()\r\n      if (socket) {\r\n        let base = this\r\n        socket.on(this.userCurrent.id +\':new-user-message\', (message) => {\r\n          base.setSocketMessage({\r\n            sender_id: message.message.from_id,\r\n            message: message.message.message\r\n          })\r\n          base.setMessageCount({\r\n            user_id: message.message.from_id\r\n            }\r\n          )\r\n          base.setUserUnreadMessage({\r\n              count: this.userCurrent.unread_messages + 1\r\n            }\r\n          )\r\n          this.scrollToBottom()\r\n        })\r\n      }\r\n    },\r\n    computed: {\r\n      ...mapGetters({\r\n        getContact: \'message/getContact\',\r\n        idUserMessage: \'message/id\',\r\n        userMessage: \'message/userMessage\',\r\n        chatMessage: \'message/chatMessage\',\r\n        userByIdMessage: \'message/userByIdMessage\',\r\n        userCurrent: \'user/user\'\r\n      }),\r\n      activeTab () {\r\n        let index = null\r\n        if (this.idUserMessage !== null && this.userMessage !== [] && this.userMessage.users !== undefined) {\r\n          const user = this.userMessage.users.find(users => users.id === this.idUserMessage)\r\n          index = this.userMessage.users.indexOf(user)\r\n        }\r\n        return index\r\n      }\r\n    },\r\n    methods: {\r\n      ...mapActions({\r\n        setUserUnreadMessage: \'user/setUserUnreadMessage\',\r\n        setUsers: \'message/setUsers\',\r\n        addUser: \'

Copyright Info

© Copyright 2013-2021 admin@qa.1r1g.com

如未特别说明,本网站的内容使用如下协议:
Creative Commons Atution-NonCommercial-ShareAlike 4.0 International license
.

用以下方式浏览
回到顶部