「socket.io を使用して、ユーザーから送信されたメッセージをすべてのクライアントのサブセットにのみブロードキャストしたいと考えています。サブセットは、メッセージを送信しているユーザーから特定の距離 (たとえば 1 km) 内にあります。必要があるようです。 [socket.on 'broadcast', (メッセージ) ] 以下のコードのセクション (これは coffeescript であり、Shoaib Burq の geochat-example github リポジトリ (https://github.com/sabman/geochat-example) から取得したものであることに注意してください)。
リカルドの提案を含め、古い [socket.on 'broadcast', (message) ->] セクションを彼の入力に置き換えます (ただし、残りの server.coffee コードとの一貫性を保つために、「user」を「record」に変更しました) 、および最後の [find:] セクション。ただし、何かがおかしいので、それが html コードに関係しているのか、coffeescript の更新に関係しているのかはわかりません。よろしくお願いします。
コードはまだ実行されていません。リカルドの最新の提案を含む:
socket.on 'broadcast', (message) ->
# find the sender and extract it's position
Character.find { clientId: socket.id }, (record) =>
chat_data =
user: record
conversation: message
[lat, lng] = record.geometry.coordinates
# find everyone within a 1km square
km = 1/111
area =
type: 'Polygon'
coordinates: [
[lat - km, lng - km]
[lat + km, lng - km]
[lat + km, lng + km]
[lat - km, lng + km]
]
Character.find { within: area }, (record) ->
// send message to each user
socket.broadcast.send JSON.stringify(chat_data)
問題は「検索」セクションにあるのではないかと感じています。たとえば、リカルドは次のように書いています。
console.log ">> find #{JSON.stringify(attrs)}"
しかし、元のコードでは、これは ">>" の代わりに "=>" で読み取られます。
console.log "=> find #{JSON.stringify(attrs)}"
qs = require 'querystring'
find: (query, callback) ->
console.log ">> find #{JSON.stringify(attrs)}"
q = { operator: "or", properties: attrs }
url = lyr_config_characters.api_url
key = lyr_config_characters.acl.get
if query.id?
url += "/#{attrs.id}?" + qs.stringify({ key })
else if query.within?
url += "/functions/within?" + qs.stringify({ key, input : query.within })
else
url += qs.stringify { key, input: q }
req =
method: "GET"
uri: url
headers: { "Content-Type": "application/json" }
request req, (error, response, body) ->
console.log error if error
console.log "<< find #{body}"
callback JSON.parse body ? '{}'
ありがとうございました!