微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更改数据时,为什么客户端不从已订阅Sails.js模型的套接字接收更新?

如何解决更改数据时,为什么客户端不从已订阅Sails.js模型的套接字接收更新?

在过去的几个小时中,我一直在尝试找出如何通过连接到Sails.js套接字的React Native客户端获取实时更新。

我没有看到我知道的任何错误消息。

在下面的代码块中,我将来自React Native功能组件discover.js的请求发送到用户/登录路径下的Sails服务器,在此我订阅了User模型。然后,我使用io.socket.on('user',...)监听客户端中的通知。但是,当我更改一个名为“ Irene”的用户的值时,这是通过find()ORM方法获得的结果,io.socket.on('user',...)事件不会在客户。

discover.js (React本机功能组件)

import * as React from 'react';
import { useContext,useState,useEffect } from 'react'
import { Text,View,StyleSheet,Animated,Button,TouchableOpacity,Dimensions } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import firebase from './../../firebase.js';
import  AuthContext  from './../imports/AuthContext.js'

var socketIOClient = require('socket.io-client');
var sailsIOClient = require('sails.io.js');

export default function discoverScreen() {

    const {user} = useContext(AuthContext)

var io = sailsIOClient(socketIOClient);

// Set some options:
// (you have to specify the host and port of the Sails backend when using this library from Node.js)
io.sails.url = 'http://localhost:1337';

io.socket.on('connect',function onConnect(){


    io.socket.post('/user/login',{uid: user.uid},function serverResponded (body,JWR) {
      // body === JWR.body
      console.log('Sails responded with: ',body);
      console.log('with headers: ',JWR.headers);
      console.log('and with status code: ',JWR.statusCode);

      if (JWR.error) {
        console.error('Could not subscribe to notifications for users named Irene: '+JWR.error);
        return;
      }
    });

    io.socket.on('user',function (msg) {
        console.log("SOCKET CLIENT NOTIFICATION")
        console.log(msg)
    });
});

login.js (Sails.js控制器文件-/api/controllers/user/login.js

module.exports = async function login(req,res) {

    if (!req.isSocket) {
      return res.badRequest();
    }

      
    try {
        var record = await User.find({
            firstName: "Irene"
        })

    } catch (err) {
        sails.log.debug(err)
    }

  User.subscribe(req.socket,_.pluck(record,'id'));

  return res.ok(record);

};

User.js (Sails.js模型文件-/api/models/User.js)

module.exports = {
  primaryKey: 'id',attributes: {
    uid: {
      type: 'string'
    },birthday: {
      type: 'string',columnType: 'date'
    },city: {
      type: 'string'
    },college: {
      type: 'string'
    },employer: {
      type: 'string'
    },firstName: {
      type: 'string'
    },fullName: {
      type: 'string'
    },gender: {
      type: 'string'
    },heightFeet: {
      type: 'number'
    },heightInches: {
      type: 'number'
    },job: {
      type: 'string'
    },lastName: {
      type: 'string'
    },religion: {
      type: 'string',isIn: [
        'Buddhist','Christian','Catholic','Spiritual but not religIoUs','Neither religIoUs nor spiritual','Other'
      ]
    },preferences: {
      model:'preference',columnName: 'preference_id'
    }
  },tableName: 'users'
}

我尝试了很多不同的事情。 我所知道的在起作用/可能不是问题的根源:

  1. 期望的行由find()方法选择。有三个用户的名字叫Irene,findOne正在获得这些用户
  2. _。pick方法正确返回了这些用户的主键[1、5、30]。
  3. 用户表的主键为id,在模型文件User.js中对此进行了指示。
  4. 即使在建立套接字连接之前也可以调用io.socket.on('user',...),因为文档说连接之前附加的事件被放入队列中,并在连接发生时运行。因此,我不认为缺少连接不是这里的问题。
  5. 名为Irene的三个用户将在回调函数serverResponded的参数“ body”中返回。
  6. 我尝试将User.subscribe的第一个参数设置为req.socket(如上面的代码所示)和req都没有,

非常感谢您的帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。