Edit Page

.publishRemove()

Broadcast a conventional message indicating that a record has been removed from one of this parent record's collections.

Something.publishRemove( id, association, fk )

Or:

  • Something.publishRemove(id, association, fk, req)
  • Something.publishRemove(id, association, fk, req, options)

Usage

Argument Type Details
1 id , The id of the parent record whose subscribers will receive this broadcast.

e.g. 4
2 association The name of the collection association.

e.g. 'pets'
3 fk The foreign key value (e.g. id) of the associated record being removed.

e.g. 9
4 req If provided, then the requesting socket will be excluded from the broadcast.
5 options A dictionary of additional options. See below.
Additional Options

By default, when publishRemove() is called, it checks whether any associated records were also affected by the removal, and possibly sends out additional notifications (if a reflexive association was changed).

For example, let's say a User model has a pets association (a plural, or "collection" association) which connects each User record with none, one, or several distinct Pet records. On the other side, let's say each Pet record has an owner association (a singular or "model" association), which means it can have exactly zero or one owners. If User.publishRemove(4, 'pets', 9) is called under these circumstances, then not only will it broadcast the normal "removedFrom" message to user 4, it will also broadcast a "updated" message to pet 9 (indicating that its owner has changed).

To suppress automatic broadcasts for reflexive associations, provide an options dictionary and set the options.noReverse flag to true.

Option Type Details
noReverse If set, automatic broadcasts for reflexive associations will be suppressed.
Behavior

publishRemove() broadcasts to all sockets subscribed to the record (e.g. via .subscribe()) and uses the model's identity as the event name. The broadcasted event data received by the subscribed sockets will be a dictionary with the following properties:

  • verb - a constant: 'removedFrom'
  • id - the parent record's id which is a or
  • attribute - the name of the collection association from whence the removed record was pulled ()
  • removedId - the id of the record that was removed (i.e. fk) which is a or

Example

Find Elixabeth by her username and steal her favorite cat, then broadcast a message about it to all of her subscribers:

User.findOne({username: 'elizabeth'})
.populate('pets', { limit: 5 })
.exec(function(err, liz){
  if (err) return res.serverError(err);
  if (!liz) return res.notFound();

  // The Pet with id=3 is Liz's favorite cat, Humphrey.
  liz.pets.remove(3);
  liz.pets.save(function (err){
    if (err) return res.serverError(err);

    // Broadcast a message telling anyone subscribed to Liz that Humphrey ran away.
    // Note that we exclude the requesting socket from the broadcast.
    // Also note that, since we set `noReverse`, no "pet" events will be broadcasted
    // to Humphrey's subscribers (Liz wouldn't want us to worry them).
    User.publishRemove(liz.id, 'pets', 3, req, { noReverse: true });

    return res.ok();
  });
});

The endpoint will respond with a simple 200 (because of res.ok()), but all subscribed client sockets will receive a user event:

// e.g. in the browser...
io.socket.on('user', function (event){
  switch (event.verb) {
    'removedFrom':
      console.log(event);
      // => see below
      break;
    default:
      console.warn('Unrecognized socket event (`%s`) from server:',event.verb, event);
  }
});

In this case, the logged message would look like this:

{
  verb: 'removedFrom',
  id: 194,
  attribute: 'pets',
  removedId: 3
}

Notes

  • This method works much in the same way as .message()-- it just represents a more specific use case and has a few special features as described above. For more conceptual background, see the overview on resourceful pubsub.
  • Be sure and check req.isSocket === true before passing in req to refer to the requesting socket. If used, the provided req must be from a socket request, not just any old HTTP request.
  • It is important to understand that this method does not actually do anything to your database-- it is purely a conventional way of announcing that changes have occurred. Underneath the covers, the resourceful pubsub methods are just using combinations of sails.sockets methods.

Is something missing?

If you notice something we've missed or could be improved on, please follow this link and submit a pull request to the sails-docs repo. Once we merge it, the changes will be reflected on the website the next time it is deployed.

Sails logo
  • Home
  • Get started
  • Support
  • Documentation
  • Documentation

For a better experience on sailsjs.com, update your browser.

Documentation

Reference Concepts App structure | Upgrading Contribution guide | Tutorials More

Reference

  • Application
    • Events
    • Lifecycle
    • sails.getRouteFor()
    • sails.getUrlFor()
    • sails.lift()
    • sails.load()
    • sails.log()
    • sails.lower()
    • sails.request()
    • sails.getBaseUrl()
  • Blueprint API
    • add to
    • create
    • destroy
    • find one
    • find where
    • populate where
    • remove from
    • update
  • Command Line Interface
    • sails console
    • sails debug
    • sails generate
    • sails lift
    • sails new
    • sails version
  • Configuration
    • sails.config.*
    • sails.config.blueprints
    • sails.config.bootstrap()
    • sails.config.connections
    • sails.config.cors
    • sails.config.csrf
    • sails.config.globals
    • sails.config.http
    • sails.config.i18n
    • sails.config.log
    • sails.config.models
    • sails.config.policies
    • sails.config.routes
    • sails.config.session
    • sails.config.sockets
    • sails.config.views
  • Request (`req`)
    • req.accepted
    • req.acceptedCharsets
    • req.acceptedLanguages
    • req.body
    • req.cookies
    • req.fresh
    • req.headers
    • req.host
    • req.ip
    • req.ips
    • req.isSocket
    • req.method
    • req.options
      • req.options.values
      • req.options.where
    • req.originalUrl
    • req.params
    • req.path
    • req.protocol
    • req.query
    • req.secure
    • req.signedCookies
    • req.socket
    • req.subdomains
    • req.url
    • req.wantsJSON
    • req.xhr
    • req.accepts()
    • req.acceptsCharset()
    • req.acceptsLanguage()
    • req.allParams()
    • req.file()
    • req.get()
    • req.is()
    • req.param()
  • Response (`res`)
    • res.attachment()
    • res.badRequest()
    • res.clearCookie()
    • res.cookie()
    • res.created()
    • res.forbidden()
    • res.get()
    • res.json()
    • res.jsonp()
    • res.location()
    • res.negotiate()
    • res.notFound()
    • res.ok()
    • res.redirect()
    • res.send()
    • res.serverError()
    • res.set()
    • res.status()
    • res.type()
    • res.view()
  • Waterline (ORM)
    • Models
      • .count()
      • .create()
      • .destroy()
      • .find()
      • .findOne()
      • .findOrCreate()
      • .native()
      • .query()
      • .stream()
      • .update()
    • Populated Values
      • .add()
      • .remove()
    • Queries
      • .exec()
      • .limit()
      • .populate()
      • .skip()
      • .sort()
      • .where()
    • Records
      • .save()
      • .toJSON()
      • .toObject()
  • WebSockets
    • Resourceful PubSub
      • .message()
      • .publishAdd()
      • .publishCreate()
      • .publishDestroy()
      • .publishRemove()
      • .publishUpdate()
      • .subscribe()
      • .unsubscribe()
      • .unwatch()
      • .watch()
      • .subscribers()
    • sails.sockets
      • .addRoomMembersToRooms()
      • .blast()
      • .broadcast()
      • .getId()
      • .join()
      • .leave()
      • .leaveAll()
      • .removeRoomMembersFromRooms()
      • sails.sockets.emit()
      • sails.sockets.id()
      • sails.sockets.rooms()
      • sails.sockets.socketRooms()
      • sails.sockets.subscribers()
    • Socket Client
      • io.sails
      • io.socket
      • SailsSocket
        • Methods
        • Properties
      • io.socket.delete()
      • io.socket.get()
      • io.socket.off()
      • io.socket.on()
      • io.socket.post()
      • io.socket.put()
      • io.socket.request()

Built with Love

The Sails framework is maintained by a web & mobile studio in Austin, TX, with the help of our contributors. We created Sails in 2012 to assist us on Node.js projects. Naturally we open-sourced it. We hope it makes your life a little bit easier!

Sails:
  • What is Sails?
  • Treeline IDE
  • Contribute
  • Logos/artwork
About:
  • The Sails Company
  • Security
  • News
  • Legal
Help:
  • Get started
  • Documentation
  • Docs
  • Enterprise
  • Hire us

© 2012-2018 The Sails Company. 
The Sails framework is free and open-source under the MIT License.