2017-02-12 12 views
1

Я хочу написать простой чат на meteor.js, и поэтому я не хочу хранить данные в database. Но я не нашел, как сделать заявку без database.Как написать простой чат, без базы данных на meteor.js и react.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); 

, но я не понимаю, что я написал не так в 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; 
}); 
+1

Просто интересно, если вы не хотите сильное метеорного паб/к югу системы, поэтому использовать Meteor? – MasterAM

+0

@MasterAM Мне нравится система pub/sub, но не всегда утомительна, что она хранится в базе данных, а не всегда в mongodb. Есть очень разные случаи и задачи. Здесь мы предполагаем прямо сейчас, чтобы не принять базовые вебры, и я пытаюсь понять, как это сделать. – alex10

ответ

1

Если вы хотите, чтобы контролировать то, что передается по публикующей, получить ссылку на «опубликовать экземпляр» (на самом деле конкретный клиент с конкретной подпиской) и использовать его 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 (массив сообщений).

Я бы рекомендовал также переименовать эти вещи, чтобы быть более многословными и ясно :)

+0

ну, я заменил серверный код, но, к сожалению, приложение не работало реактивно. Может быть, я делаю что-то не так в версии клиента? – alex10

+1

Что я добавил здесь, как заставить его работать настойчиво. Вы не обращали внимания на уведомление клиентов при изменении массива сообщений. Правильное место для этого - в теле метода. – DoctorPangloss

+0

Когда я отправляю сообщение клиенту, он не отображается одновременно на других клиентах. И я не знаю, что еще нужно сделать, чтобы заставить его работать. Поскольку серверный код, как обычно, я предположил, что с клиентским кодом что-то не так. – alex10

2

Что вы думаете, что не будет работать. Поскольку Meteor.publish возвращает курсор на Collection или array из Collections. Согласно official documentation:

Публичные функции могут возвращать Collection.Cursor, и в этом случае Meteor опубликует документы этого курсора каждому подписанному клиенту. Вы также можете вернуть массив Collection.Cursors, и в этом случае Meteor опубликует все курсоры.

Опять же, когда вы подписываетесь на публикацию, она хранит данные (как курсор в том же сборнике, что и публикация) локально в MiniMongo. Таким образом, чат без базы данных технически невозможен с pub-sub в Meteor.

+0

Хорошо, я обновил код и сделал для возврата серверной части массива наборов. Но я до сих пор не вижу реактивности, и чат не обновляется после отправки сообщений :( – alex10

+1

Это не совсем точно, так как возврат курсора - это только один из способов публикации данных. Вы можете вручную отправлять сообщения «добавлены» (и другие) и, возможно, даже использовать локальную (в памяти) коллекцию на стороне сервера (я думаю, что я использовал один в одном из моих расширений для публикаций). – MasterAM

+0

@MasterAM Вы можете ответить или ссылаться на простой пример в этом контексте? – alex10