2014-03-31 9 views
6

Wie werden SailsJS-Routen zur Unterstützung von "Pushstate" eingerichtet, können jedoch Anforderungen mit dem Präfix /api zusammen mit statischen Ressourcen auch bedient werden?So richten Sie Sails.js-Routen zur Unterstützung von Pushstate mit einem SPA am Frontend ein

Verwendung:

  • Backbone 1.x mit pushState: true
  • Segel 0.10.x

vorgeschlagene Lösung aus diesem thread ist die /* Platzhalter zu verwenden und alle im Hinblick auf den Index umleiten.

/path/to/app/config/routes.js

'/*': { 
    view: 'index' 
} 

Das Problem ist, dass dies alles zu indizieren umleitet. einschließlich statischer Datei-Assets scheint die Express.static-Middleware keine Wirkung zu haben, diese Route hat irgendwie Vorrang.

Auch dieser Präfix unten keine Auswirkungen hat, da die Route über Vorrang, aber das Präfix funktioniert, wenn ich nur den Platzhalter dh '/': { view: 'index' }

/path entfernen/zu/app/config/Plan Js

module.exports.blueprints = { 
    ... 
    prefix: '/api', 
    ... 
} 

Offensichtlich scheint dies nicht als Kern sailsJS Problem, sondern meine minimalen Kenntnisse der Express.js Router, denn das ist, was sailsjs verwendet.

Theoretisch könnte ich explizit nur alle Vermögenswerte auflisten Routen Präfix und einen Controller, allen zu dienen, da sie gut bekannt sind und statisch, dh '/js*': { controller: 'AssetsController', action: 'serve', und so weiter für '/styles*', '/images*', '/templates*', '/fonts*', aber ich Da ich wirklich zögerlich bin, hoffe ich auf eine bessere Übungslösung.

das wird sich auch nicht diese Routen /api Problem mit dem '/*'

Antwort

8

Wenn Sie bereit sind, diezu verwenden, können Sie die skipRegex Route-Option verwenden, um Ihre Wildcard Route API-Anfragen ignorieren zu lassen, und die skipAssets Option, es zu haben Asset-URLs ignorieren:

'/*' : {view: 'index', skipAssets: true, skipRegex: /^\/api\/.*$/} 

Andernfalls können Sie einen Controller erstellen Sie Ihre Ansicht zu dienen, und fügen Sie der Code unbeabsichtigt angepassten URLs in dem Aktionscode überspringen:

// api/controllers/StaticController.js 
module.exports = { 
    index: function(req, res, next) { 
     if (req.path.match(/\..*/g) || req.path.match(/^\/api\/.*$/)) { 
     return next(); 
     } 
     return res.view('index'); 
    } 
} 

dann in /config/routes.js:

'/*': 'StaticController.index' 

......

+0

Ich bin auf 0.10.0-rc4, also wth - Vielen Dank, Ihr erster Vorschlag ist, was ich suche. – bentael

+0

möchte nur darauf hinweisen, dass das Regexp-Muster bei '/' beginnen muss, also 'skipRegex:/^ \/api \ /.*$/' - Ich habe Ihren Beitrag bearbeitet. Danke – bentael

+0

Danke für die Antwort. Wie kann ich auf index.html von öffentlichen Ordner statt von Ansichten verweisen? –

1

Wildcard lösen Versuchen Sie, Ihre config/404.js Datei zu aktualisieren.

  1. Entfernen Sie die folgenden Schritte aus:

    res.status(result.status); 
        res.render(viewFilePath, function (err) { 
        // If the view doesn't exist, or an error occured, send json 
        if (err) { return res.json(result, result.status); } 
    
        // Otherwise, serve the `views/404.*` page 
    
        res.render(viewFilePath); 
        }); 
    
  2. hinzufügen: res.redirect("/");

Prost

+1

Dies würde die 404-Seite auf der ganzen Linie deaktiviert, auch für/api Routen, die nicht existieren ... – sgress454

+0

@ScottGress Sie haben Recht, es sei denn, natürlich überprüfe ich 'req.wantsJSON' und ich schließe meine font-end '/ api' Anfragen ab, um JSON die ganze Zeit anzufordern. @ tUrG0n Ihre Lösung war in der Nähe, außer dass ich nicht umleiten ('/') 'da würde die URL ändern, stattdessen konnte ich this.res.view ('homepage') 'an der oben in der Funktion, oh und in 'sails 0.10.0-rc4' scheint es, dass' config/404.js' in 'api/responses/notFound.js' verschoben wurde, aber dieselbe Logik. Überlastung der '404' Route scheint ein bisschen hacky, ich denke, ich bin mit @ScottGress Antwort wie unten die Straße, das wäre der richtige Weg dazu. – bentael