URL Переписывание с помощью ExpressJS

19

Я хотел бы переписать свои URL-адреса на моем сайте ExpressJS. Я использовал этот плагин, Ссылка , но он не работает ...

Однако я, возможно, допустил ошибку ...

Мой файл 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'))
        })
    }
});

Мое сообщение об ошибке:

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)
    
задан tonymx227 16.05.2013 в 07:11
источник

5 ответов

32

Итак, у меня была такая же проблема. Я написал приложение, которое использует API истории в браузерах, и я хотел переписать все нестатические URL-адреса обратно на index.html . Поэтому для статических файлов я сделал:

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

Но тогда для API, созданных API истории, я сделал:

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

Это означает, что любой запрос, который не был файлом или каталогом в / (например, URL-адресом, сгенерированным API-интерфейсом истории), не был бы перезаписан или перенаправлен, но вместо этого будет обработан файл index.html и затем выполняет всю магию маршрутизации JS.

Надеюсь, это близко к тому, что вы ищете?

    
ответ дан Ahmed Nuaman 22.06.2013 в 09:18
  • Да, это то, что я ищу, спасибо! –  tonymx227 26.06.2013 в 23:20
  • Это сработало и для меня! Спасибо! –  wmock 17.07.2014 в 05:22
  • Я не могу заставить его работать, может мне помочь? stackoverflow.com/questions/27971489/... –  Leandro Hoffmann 21.01.2015 в 13:28
  • что я могу сделать, если мне нужно переписать с помощью регулярного выражения? stackoverflow.com/questions/38117026/expressjs-rewrite-regex –  bodley 30.06.2016 в 10:41
  • , но из-за этого, если ударил простой HTTP-запрос, который возвращает json ..... в это время будет также вызван index.html. Так что это нехорошее решение. –  vijay 28.02.2017 в 11:25
22

Вы можете переписать URL-адрес, прежде чем перейти к обработчику, который хотите использовать.

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

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

Я использовал аналогичный метод , чтобы переписывать URL с регулярными выражениями.

    
ответ дан Bryan 07.01.2014 в 20:18
3

Решение, которое работает без response.sendfile(..) , заключается в использовании промежуточного программного обеспечения перезаписи, которое вставлено до app.use(express.static(..)) следующим образом:

// 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(...)

Таким образом, expressjs правильно распознает переписывание. Затем промежуточное ПО static позаботится об обслуживании файла.

    
ответ дан nre 09.04.2014 в 18:14
0

вы можете проверить URL-адрес с условием if и использовать app.redirect для перенаправления на определенный URL-адрес.

    
ответ дан Rubin bhandari 09.10.2018 в 12:42
-2

Попробуйте следующее:

app.get('/toto', function(req, res) {
  res.redirect('/heytoto');
});
    
ответ дан Matthis Stenius 01.06.2013 в 13:46
  • Да, но это перенаправление ... И я хочу переписать мои URL-адреса. Я не хочу использовать функцию res.redirect (). –  tonymx227 01.06.2013 в 22:04