问题描述
在过去的几个小时中,我一直在尝试找出如何通过连接到Sails.js套接字的React Native客户端获取实时更新。
我没有看到我知道的任何错误消息。
在下面的代码块中,我将来自React Native功能组件discover.js的请求发送到用户/登录路径下的Sails服务器,在此我订阅了User模型。然后,我使用io.socket.on('user',...)监听客户端中的通知。但是,当我更改一个名为“ Irene”的用户的值时,这是通过find()ORM方法获得的结果,io.socket.on('user',...)事件不会在客户。
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'
}
我尝试了很多不同的事情。 我所知道的在起作用/可能不是问题的根源:
- 期望的行由find()方法选择。有三个用户的名字叫Irene,findOne正在获得这些用户。
- _。pick方法正确返回了这些用户的主键[1、5、30]。
- 用户表的主键为
id
,在模型文件User.js中对此进行了指示。 - 即使在建立套接字连接之前也可以调用io.socket.on('user',...),因为文档说连接之前附加的事件被放入队列中,并在连接发生时运行。因此,我不认为缺少连接不是这里的问题。
- 名为Irene的三个用户将在回调函数serverResponded的参数“ body”中返回。
- 我尝试将User.subscribe的第一个参数设置为req.socket(如上面的代码所示)和req都没有,
非常感谢您的帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)