Javascript 如何在meteor.js和react.js上没有数据库的情况下编写简单的聊天?

Javascript 如何在meteor.js和react.js上没有数据库的情况下编写简单的聊天?,javascript,arrays,reactjs,meteor,websocket,Javascript,Arrays,Reactjs,Meteor,Websocket,我想在meteor.js上写一个简单的聊天,因此我不想将数据存储在数据库中。 但我从未发现如何在没有数据库的情况下创建应用程序 下面是一个我可以想象的代码示例。 服务器代码: export let ws = [{_id:'1', text:'test1'}, {_id:'2', text:'test2'}]; Meteor.publish('ws', function wsPub() { return ws; }); let ctr = 3; Meteor.methods({ 'addM

我想在
meteor.js
上写一个简单的聊天,因此我不想将数据存储在
数据库中。
但我从未发现如何在没有
数据库的情况下创建应用程序

下面是一个我可以想象的代码示例。 服务器代码:

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);

你所想的行不通。因为
Meteor.publish
将光标返回到
集合的
集合
数组
。根据报告:

发布函数可以返回Collection.Cursor,在这种情况下,Meteor将向每个订阅的客户端发布该Cursor的文档。您还可以返回Collection.Cursors数组,在这种情况下,Meteor将发布所有的Cursors


同样,当您订阅发布时,它会在本地存储数据(作为与发布相同的集合的游标)。因此,Meteor中的pub-sub在技术上不可能实现没有数据库的聊天。

如果要控制通过发布发送的内容,请获取“发布实例”(实际上是具有特定订阅的特定客户端)的引用,并使用其
添加
/
更改
/
删除
命令:

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);});
    }
});
关于您在更新中编写的代码:您正在发送一个
字符串
,其中添加的
函数需要一个文档(一个
对象
)。此外,与上面的示例不同,当
ws
(消息数组)发生更改时,您不会告诉客户端


我还建议重命名这些内容,使其更加详细和清晰:)

好的,我已经更新了代码,并使其返回集合数组的服务器部分。但我仍然看不到反应,发送消息后聊天也没有更新:(这并不完全准确,因为返回光标只是发布数据的方式之一。您可以手动发送
添加的
消息(以及其他),甚至可以使用本地(内存中)收集服务器端(我想我在我的一个出版物扩展中使用了一个)@MasterAM您可以回答或引用此上下文中的一个简单示例?只是想知道,如果您不想要Meteor的发布/订阅系统的优势,为什么要使用Meteor?@MasterAM我喜欢发布/订阅系统,但它并不总是存储在数据库中,而不总是存储在mongodb中。有非常不同的情况和任务。这里我们假设没有w不需要它就可以制作一个基本的vebrts,我正在尝试理解如何做。嗯,我替换了服务器端代码,但不幸的是应用程序没有反应性地工作。也许我在客户端版本中做了一些错误?我在这里添加的是如何让它反应性地工作。当消息发出时,你忽略了实际通知客户端es数组已更改。正确的位置是在方法体中。当我向客户端发送消息时,它不会同时显示在其他客户端上。我不知道如何才能使其正常工作。因为服务器端代码与正常代码类似,所以我假设客户端代码有问题。您编写的代码永远不会出现问题工作,因为
self.added(“msg”,msg.\u id,msg.text)
永远不会工作您不能发送
added
需要文档/对象的字符串(在第三个参数中)。假设您修复了此问题,您将需要执行我上面所做的操作,并在每次发送消息时在每个订阅的客户端上调用
added
。我已经完成了此答案中所写的操作。但是,如果一个客户端添加了聊天消息,其他客户端看不到此消息。我假设我在clien中的createContainer中编写了一些内容t代码。
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);});
    }
});