我想在meteor.js
上写一个简单的聊天,因此我不想将数据存储在database
中。
但是我没有找到如何在没有database
的情况下创建应用程序。
这是我能想象的代码示例。 服务器代码:
export let ws = [{_id:'1', text:'test1'}, {_id:'2', text:'test2'}];
Meteor.publish('ws', function wsPub() { return ws; });
let ctr = 3;
Meteor.methods({
'addMsg'(text) { ws.push({_id:ctr+1, text:text}); }
});
和客户端代码:
import {ws} from '../api/model.js';
class Rtc extends Component {
constructor(props) {
super(props);
}
addMsg(e){
e.preventDefault();
Meteor.call('addMsg', this.refs.input.value);
}
render() {
return (
<div>
{this.props.ws.map((item, i)=>{
return(<span key={i._id}>{item.text}</span>);
})}
<input type="text" ref="input" />
<input type="submit" value="submit" onClick={this.addMsg.bind(this)}/>
</div>
);
}
}
export default createContainer( () => {
Meteor.subscribe('ws');
return { ws: ws };
}, Rtc);
但是我不明白我写的是createContainer
中的不是这样?
UPD:我更新了服务器代码,但仍然无法使用websockets:
Meteor.publish('ws', function wsPub() {
let self = this;
ws.forEach( (msg)=> {
self.added( "msg", msg._id, msg.text );
});
self.ready();
// return ws;
});
答案 0 :(得分:2)
你认为不会起作用。因为Meteor.publish
会将光标返回Collection
或array
Collections
。根据{{3}}:
发布函数可以返回Collection.Cursor,在这种情况下,Meteor会将该游标的文档发布到每个订阅的客户端。您还可以返回一组Collection.Cursors,在这种情况下,Meteor将发布所有游标。
同样,当您订阅发布时,它会在official documentation中本地存储数据(作为游标与发布相同的集合)。因此,在Meteor中使用pub-sub技术上无法进行无数据库的聊天。
答案 1 :(得分:1)
如果您想控制通过发布发送的内容,请获取对&#34;发布实例的引用&#34; (实际上是具有特定订阅的特定客户端)并使用其add
/ change
/ remove
命令:
let messages = [];
let clients = [];
Meteor.publish('ws', function() {
clients.push(this);
_.each(messages, (message) => {this.added('msg', message._id, message);});
this.ready();
});
Meteor.methods({
addMsg(text) {
let newMessage = {_id: Meteor.uuid(), text: text};
messages.push(newMessage);
_.each(clients, (client) => {client.added('msg', newMessage._id, newMessage);});
}
});
关于您在更新中撰写的代码:您发送string
函数added
需要文档(object
)。此外,与上面的示例不同,您不会在ws
(消息数组)发生更改时告诉客户端。
我建议将这些内容重命名为更详细和清晰:)