Wie leite ich die Browser-URL des Benutzers auf eine andere Seite in Nodejs um?

81

In der Anwendung, die ich zu schreiben versuche, hat die Hauptseite ( http: // localhost: 8675 ) die folgende Form:

<form action='/?joinnew' method='post'>
  <button>Start</button>
</form>

Hier ist der Code in server.js:

http.createServer(function(request, response) {
  var root = url.parse(request.url).pathname.split('/')[1];
  if (root == '') {
    var query = url.parse(request.url).search:
    if (query == '?joinnew') {
      var newRoom = getAvaliableRoomId(); // '8dn1u', 'idjh1', '8jm84', etc.
      // redirect the user's web browser to a new url
      // ??? How to do.  Need to redirect to 'http://whateverhostthiswillbe:8675/'+newRoom
...
}}}

Ich würde es lieben, wenn es einen Weg gäbe, wo ich die Hostadresse nicht kennen müsste, da sich dies ändern könnte.

Das 'http'-Objekt ist eine reguläre Anforderung (' http '), NICHT erforderlich (' express ').

Tanaki
quelle
1
Danke für "NICHT ausdrücken ..". Ein bisschen traurig, wie Node.js Express.js praktisch "wird".
Marko-36

Antworten:

132
response.writeHead(301,
  {Location: 'http://whateverhostthiswillbe:8675/'+newRoom}
);
response.end();
ebohlman
quelle
10
Im Knoten können Sie auch response.writeHead(301, { Location: '/path' });ohne die vollständige URL verwenden, was nützlich ist, wenn Sie den Hostnamen oder das Protokoll vorher nicht kennen.
Adria
1
Verwenden Sie den Code 307, wenn Chrome die Weiterleitung nicht unbedingt zwischenspeichern soll! In dem oben aufgeführten Fall führt die Rückgabe von 301 dazu, dass Browser IMMER demselben Raum beitreten, selbst wenn Ihr Server ihm einen anderen / neuen Raum mitteilt!
Brian Ellis
92

Für diejenigen, die (im Gegensatz zu OP) die Express- Bibliothek verwenden:

http.get('*',function(req,res){  
    res.redirect('http://exmple.com'+req.url)
})
David Seholm
quelle
12
Für entsprechende Gutschrift ... stackoverflow.com/questions/7450940/…
David Seholm
2
Ist es möglich, ohne das Express-Paket auszukommen?
Tanaki
Vielen Dank. das ist was ich brauchte
liza
2
beantwortet die Frage nicht
Alex Jone
1
@AlexJone Es bietet zusätzliche nützliche Informationen. Antworten auf SO sollten nicht immer als eigenständig betrachtet werden.
Paul Stelian
34

OP: "Ich würde es lieben, wenn es einen Weg gäbe, wo ich die Hostadresse nicht kennen müsste ..."

response.writeHead(301, {
  Location: "http" + (request.socket.encrypted ? "s" : "") + "://" + 
    request.headers.host + newRoom
});
response.end();
ciso
quelle
3

In Express können Sie verwenden

res.redirect('http://example.com');

Benutzer vom Server umleiten.

Um einen Statuscode 301 oder 302 aufzunehmen, kann dieser verwendet werden

res.redirect(301, 'http://example.com');
agravat.in
quelle
1

Wenn Sie verwenden Express, ist die sauberste vollständige Antwort dies

const express = require('express')
const app     = express()

app.get('*', (req, res) => {
  // REDIRECT goes here
  res.redirect('https://www.YOUR_URL.com/')
})

app.set('port', (process.env.PORT || 3000))
const server = app.listen(app.get('port'), () => {})
vintagexav
quelle
0

Sie können die Methoden res.render () oder res.redirect () verwenden, um mit node.js express auf eine andere Seite umzuleiten

Z.B:

var bodyParser = require('body-parser');
var express = require('express');
var navigator = require('web-midi-api');
var app = express();

app.use(express.static(__dirname + '/'));
app.use(bodyParser.urlencoded({extend:true}));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.set('views', __dirname);

app.get('/', function(req, res){
    res.render("index");
});

//This reponds a post request for the login page
app.post('/login', function (req, res) {
    console.log("Got a POST request for the login");
    var data = {
        "email": req.body.email,
        "password": req.body.password
    };

    console.log(data);

    //Data insertion code
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";

    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("college");
        var query = { email: data.email };
        dbo.collection("user").find(query).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            if(result[0].password == data.password)


 res.redirect('dashboard.html');
            else


 res.redirect('login-error.html');
            db.close();
        });
    });

});


// This responds a POST request for the add user
app.post('/insert', function (req, res) {
    console.log("Got a POST request for the add user");

    var data = {
        "first_name" : req.body.firstName,
        "second_name" : req.body.secondName,
        "organization" : req.body.organization,
        "email": req.body.email,
        "mobile" : req.body.mobile,
    };

    console.log(data);

    **res.render('success.html',{email:data.email,password:data.password});**

});


//make sure that Service Workers are supported.
if (navigator.serviceWorker) {
    navigator.serviceWorker.register('service-worker.js', {scope: '/'})
        .then(function (registration) {
            console.log(registration);
        })
        .catch(function (e) {
            console.error(e);
        })
} else {
    console.log('Service Worker is not supported in this browser.');
}


// TODO add service worker code here
if ('serviceWorker' in navigator) {
    navigator.serviceWorker
        .register('service-worker.js')
        .then(function() { console.log('Service Worker Registered'); });
}

var server = app.listen(63342, function () {

    var host = server.address().host;
    var port = server.address().port;

    console.log("Example app listening at http://localhost:%s", port)
});

Hier im Anmeldeabschnitt: Wenn die E-Mail-Adresse und das Kennwort in der Datenbank übereinstimmen, wird die Site an dashbaord.html weitergeleitet. Andernfalls wird page-error.html mit der Methode res.redirect () angezeigt. Sie können auch res.render () verwenden, um eine Seite in node.js zu rendern

Codemaker
quelle