¿Cómo redirigir la URL del navegador del usuario a una página diferente en Nodejs?

81

En la aplicación que estoy intentando escribir, la página principal ( http: // localhost: 8675 ) tiene la siguiente forma:

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

Aquí está el código en 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
...
}}}

Me encantaría que hubiera una forma de hacerlo en la que no tuviera que saber la dirección del anfitrión, ya que eso podría estar cambiando.

El objeto 'http' es un requisito regular ('http'), NO un requisito ('express').

Tanaki
fuente
1
Gracias por "NO expresar ...". Es un poco triste cómo Node.js prácticamente se está "convirtiendo" en Express.js.
marko-36

Respuestas:

133
response.writeHead(301,
  {Location: 'http://whateverhostthiswillbe:8675/'+newRoom}
);
response.end();
ebohlman
fuente
10
En el nodo también puede usar response.writeHead(301, { Location: '/path' });sin la URL completa, útil para cuando no conoce el nombre de host o el protocolo de antemano.
adriaan
1
Use el código 307 si no desea que Chrome almacene en caché la redirección de manera preeminente. En el caso mencionado anteriormente, devolver 301 hará que los navegadores SIEMPRE se unan a la misma sala, ¡incluso cuando su servidor le diga una sala diferente / nueva!
Brian Ellis
92

Para aquellos que (a diferencia de OP) están usando express lib:

http.get('*',function(req,res){  
    res.redirect('http://exmple.com'+req.url)
})
David Seholm
fuente
12
Para obtener el crédito apropiado ... stackoverflow.com/questions/7450940/…
David Seholm
2
¿Es posible hacerlo sin el paquete 'express'?
Tanaki
Gracias. esto es lo que necesitaba
liza
2
no responde la pregunta
Alex Jone
1
@AlexJone Ofrece una información adicional útil. Las respuestas en SO no siempre deben considerarse independientes.
Paul Stelian
34

OP: "Me encantaría si hubiera una forma de hacerlo en la que no tuviera que saber la dirección del host ..."

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

En Express puedes usar

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

para redirigir al usuario desde el servidor.

Para incluir un código de estado 301 o 302 se puede utilizar

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

Si está usando Express, la respuesta completa más limpia es esta

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
fuente
0

Puede usar el método res.render () o res.redirect () para redirigir a otra página usando node.js express

P.ej:

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)
});

Aquí, en la sección de inicio de sesión, si el correo electrónico y la contraseña coinciden en la base de datos, entonces el sitio se dirige a dashbaord.html; de lo contrario, mostraremos page-error.html utilizando el método res.redirect (). También puede usar res.render () para representar una página en node.js

Codemaker
fuente