2013-05-16 5 views
18

Vorrei riscrivere i miei URL sul mio sito Web ExpressJS. Ho usato questo plugin, https://github.com/joehewitt/express-rewrite, ma non funziona ...con ExpressJS

Tuttavia, potrei aver fatto un errore ...

Il mio file app.js:

var express = require('express') 
    , index = require('./routes/index.js') 
    , admin = require('./routes/admin.js') 
    , contact = require('./routes/contact.js') 
    , posts = require('./routes/posts.js') 
    , http = require('http') 
    , path = require('path') 
    , hash = require('./auth').hash 
    , db = require('./models') 
    , favicons = require('connect-favicons') 
    , rewriter = require('express-rewrite'); 


var app = express(); 

app.configure(function() { 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon(__dirname + '/public/images/FAVICON.ico')); 
    app.use(favicons(__dirname + '/public/images/apple-touch-icon.png')); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.static(path.join(__dirname, 'public'))); 
    app.use(express.cookieParser()); 
    app.use(express.cookieSession({ 
      secret: 'SECRET', 
      cookie: { access: false } 
     }) 
    ); 
    app.use(rewriter); 
    app.use(app.router); 
    app.use(function(req, res, next){ 
     res.render('404.jade', { 
      title: "404 - Page Not Found", 
      showFullNav: false, 
      status: 404, 
      url: req.url 
     }); 
    }); 
}); 

app.configure('development', function() { 
    app.use(express.errorHandler()); 
}); 

app.get('/', index.index); 

app.get('/toto', rewriter.rewrite('/heytoto')); 

db.sequelize.sync().complete(function(err) { 
    if (err) { 
     throw err 
    } else { 
     http.createServer(app).listen(app.get('port'), function(){ 
      console.log('Express server listening on port ' + app.get('port')) 
     }) 
    } 
}); 

il mio messaggio di errore:

Express 
500 TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'match' 
at Object.rewriter [as handle] (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express-rewrite/rewrite.js:3:26) 
at next (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/proto.js:199:15) 
at Object.cookieSession [as handle] (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js:113:5) 
at next (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/proto.js:199:15) 
at Object.cookieParser [as handle] (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js:60:5) 
at next (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/proto.js:199:15) 
at resume (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/middleware/static.js:60:7) 
at SendStream.error (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/connect/lib/middleware/static.js:73:37) 
at SendStream.EventEmitter.emit (events.js:126:20) 
at SendStream.error (/Users/anthonycluse/Sites/Anthony-Cluse-Express/node_modules/express/node_modules/send/lib/send.js:147:51) 

risposta

28

Quindi ho avuto lo stesso problema. Ho scritto un'app che utilizza l'API di cronologia sui browser e volevo riscrivere tutti gli URL non statici su index.html. Così per file statici che ho fatto:

app.configure(function() { 
    app.use('/', express.static(__dirname + '/')); 
}); 

Ma poi per l'API storia ha generato percorsi che ho fatto:

app.get('*', function(request, response, next) { 
    response.sendfile(__dirname + '/index.html'); 
}); 

Ciò significa che qualsiasi richiesta che non era un file o una directory in / (come ad esempio un URL generato dall'API della cronologia) non verrebbe riscritto o reindirizzato, ma verrà invece pubblicato il file index.html e quindi tutte le magie di routing JS.

Speriamo che sia vicino a quello che stai cercando?

+0

Sì, è un po 'quello che sto cercando, grazie! – tonymx227

+0

Questo ha funzionato anche per me! Grazie! – wmock

+0

Non riesco a farlo funzionare, può aiutarmi? http://stackoverflow.com/questions/27971489/refresh-specific-page-with-angular-express-and-jade-using-html5mode?noredirect=1#comment44494193_27971489 –

-2

Prova questo:

app.get('/toto', function(req, res) { 
    res.redirect('/heytoto'); 
}); 
+3

Sì, ma è un reindirizzamento ... E voglio riscrivere i miei URL Non voglio usare la funzione "res.redirect()". – tonymx227

16

È possibile riscrivere l'URL prima di raggiungere il gestore che si desidera utilizzare.

app.use(function(req, res, next) { 
    if (req.url === '/toto') { 
    req.url = '/heytoto'; 
    } 
    next(); 
}); 

app.get('/heytoto', ...); 

ho usato un similar method a che fare URL riscrive con le espressioni regolari.

2

Una soluzione che funziona senza response.sendfile(..) è usare un middleware riscrittura che viene inserito prima app.use(express.static(..)) simili:

// forward all requests to /s/* to /index.html 

app.use(function(req, res, next) { 

    if (/\/s\/[^\/]+/.test(req.url)) { 
    req.url = '/index.html'; 
    } 

    next(); 
}); 

// insert express.static(...) 

questo modo, expressjs riconosce correttamente la riscrittura. Il middleware static si occuperà quindi di servire il file.