Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Tbranyen - RSS povratne informacije

Generisanje RSS povratnih informacija sa Backbone.js kolekcije u Node.js


Kada dizajnirate i razvijate sajt, nisam u potpunosti bio upućen u korišćenje Backbone strukture sa gledišta servera. Benefiti nisu odmah bili jasni. Ipak nakon korišćenja bloga upotrebom Models, Collections i Events, veoma sam srećan što sam odabrao Backbone. Događaji su veoma zahvalni kada je u pitanju RSS povratna informacija kao što ćete videti.

Nikakva magija nije ovde napisana, niti za rešavanje bilo kakvih pitanja, samo eleganta organizacija koda i implementacija.

Ima stvari koje su obavezne:

Kako struktuirati server:

Pošto se u ovom postu govori samo o generisanju RSS, pokazaću vam kako moj server izgleda da bih vam olakšao implementaciju istog na vašoj sopstvenoj aplikaciji. Slomiću Model i Collection kod nakon prikazivanja servera.

// Require server dependencies
var Backbone = require("backbone");
var express = require("express");
var RSS = require("rss");

/* Post Model and Posts Collection exist here outside the route, which is
 * possible since Node.js is the server and script coupled, and exists
 * entirely in memory.
 */

// Route to specific post
site.get("/post/:id", function(req, res) { /* ... */ });

// Currently does nothing, will show soon how to serve this
site.get("/rss.xml", function(req, res) { /* ... */ });

// Render out home page with list of posts
site.get("/", function(req, res) { /* ... */ });

Proveravanje Model:

Ovaj Post model jeste odgovoran za rukovođenje sa slugification, koja se koristi kod jedinstvene strukture URL za svaki Post. idAttribute je veoma koristan kasnije kada vam je potrebno da pronađete Post koji odgovara id parametru koji jeste dostupan u unosu Post rutine koju možete videti gore na mom serveru.

var Post = Backbone.Model.extend({
  // This is a great way to reference the post later, since its unique
  idAttribute: "slug",

  // When initialized from collection fetch generate the slug
  initialize: function() {
    this.set({ slug: this.slugify() });
  },

  // Convert the title attribute into a URL friendly slug
  slugify: function(title) {
    return this.get("title").toLowerCase().replace(/ /g, "-")
      .replace(/[^\w-]+/g, "");
  }
});

Podešavanje Collection:

Kada Posts kolekcija dođe do inicijalizacije novi RSS objekat se napravi i priključuje se kao ponovno korišćeno vlasništvo. Metoda sinhronizacije se izbacuje u početku jer ima mnogo kodova koji u ovom postu nisu prikazani. Samo imajte na umu da sam sinhromizaciju zaobišao da bih popunio kolekciju sa fajlovima iz sistema fajlova.

var Posts = Backbone.Collection.extend({
  model: Post,

  // Sort by most recent posted date
  comparator: function(post) {
    return -1 * new Date(post.get("posted"));
  },

  // Fetches posts from Git folder
  sync: function(method, model, options) { /* ... */ },

  // Create a new RSS feed and assign it as a property on the Collection
  initialize: function() {
    this.feed = new RSS({
      title: "Tim Branyen @tbranyen",
      description: "JavaScript and web technology updates.",
      feed_url: "http://tbranyen.com/rss.xml",
      site_url: "http://tbranyen.com",
      image_url: "",
      author: "Tim Branyen @tbranyen"
    });
  }
});

// Initialize a global reference to all Posts
var posts = new Posts();

Dodavanje stavke u Feed:

RSS regeneracija se dešava samo kada Posts kolekcija se ažurira. S obzirom da jedina mutacija koju radim jeste resetovanje, nema potrebe i taj događaj dodavati dešavanjima.

posts.bind("reset", function() {
  // Iterate over all the Posts and set the context to the Collection
  posts.each(function(post) {
    // Add each post into the feed property on the Collection
    this.feed.item({
      title: post.get("title"),
      description: post.get("title"),
      date: post.get("posted"),
      url: "http://tbranyen.com/post/" + post.id
    });
  }, posts);
});

Pokretanje resetovanog događaja:

Resetovani događaj se pokreće pomoću Backbone, kada god Posts kolekcija u otšpunosti se zamenjuje. Pošto se nikada neće dogoditi da ja u potpunosti dodam novi Post model, ovaj događaj će se nazvati savršeno kada god ja pokrenem metodu dodavanja. Inače Backbone će resetovati novu strukturu podataka u kolekciju.

Ovo ažuriranje se dešava sa intervalom koji nastaje svakih sat vremena, van ovog koda imam još jesno mesto koje mogu ručno pokrenuti na serveru da boh uradio istu stvar (korisno je veoma kada postavim novi Post, kao što je ovaj!)

setInterval(function() {
  posts.reset([]);
  posts.fetch();

// Refresh Posts Collection once an hour
}, 3600000);

// Always fetch immediately
posts.fetch();

Isporuka RSS:

Ako se vratimo na RSS rutu, evo kako stvarna isporuka funkcioniše i sada izgleda. Samo moram da podesim ispravnost Content-Type i poziva xml metodu na objektu.

site.get("/rss.xml", function(req, res) {
  res.contentType("rss");
  res.send(posts.feed.xml());
});

Kao što smo već videli sama struktura je veoma lepa, i ne pretvara se u povraćaj svega kada koristim neki događaj. Šta vi o tome mislite?

Published (Last edited): 28-05-2013 , source: http://tbranyen.com/post/generating-rss-feeds-from-a-backbonejs-collection-in-nodejs