在过去的几个小时里,我一直试图弄清楚如何使用连接到 Sails.js 套接字的 React Native 客户端获取实时更新。
我没有看到任何我知道的错误消息。
在下面的代码块中,我从 React Native 功能组件 discover.js 发送一个请求到路由用户/登录处的 Sails 服务器,在那里我订阅了用户模型。然后,我使用 io.socket.on('user', ...) 在客户端收听通知。但是,当我更改名为“Irene”的用户之一的值时,即 find() ORM 方法获得的结果,io.socket.on('user', ...) 事件不会在客户如预期。
discover.js(一个 React Native 功能组件)
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] 的主键。
- users 表的主键是
id
,这在模型文件 User.js 中如此指示 - io.socket.on('user', ...) 甚至可以在建立套接字连接之前调用,因为文档说连接之前附加的事件被放置在队列中并在连接发生时运行。所以我不认为缺乏联系是这里的问题。
- 在回调函数 serverResponded 的参数“body”中返回了三个名为 Irene 的用户。
- 我尝试将 User.subscribe 的第一个参数设置为 req.socket(如上面的代码所示)和简单的 req,但都不起作用。
帮助将不胜感激。