Làm cách nào để chuyển hướng URL trình duyệt của người dùng đến một trang khác trong Nodejs?


81

Trong ứng dụng tôi đang cố viết, trang chính ( http: // localhost: 8675 ) có dạng sau:

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

Đây là mã trong 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
...
}}}

Tôi rất thích nếu có cách nào đó để làm điều đó mà tôi không cần phải biết địa chỉ máy chủ lưu trữ, vì điều đó có thể thay đổi.

Đối tượng 'http' là một yêu cầu thông thường ('http'), KHÔNG yêu cầu ('express').


1
Cảm ơn vì "NOT express ..". Kinda buồn vì Node.js thực tế đang "trở thành" Express.js.
marko-36

Câu trả lời:


133
response.writeHead(301,
  {Location: 'http://whateverhostthiswillbe:8675/'+newRoom}
);
response.end();

10
Trong nút, bạn cũng có thể sử dụng response.writeHead(301, { Location: '/path' });mà không có URL đầy đủ, hữu ích khi bạn không biết trước tên máy chủ hoặc giao thức.
adriaan

1
Sử dụng mã 307 nếu bạn không muốn chrome chuyển hướng vào bộ nhớ cache một cách ưu việt! Trong trường hợp được liệt kê ở trên, việc trả về 301 sẽ khiến các trình duyệt LUÔN LUÔN tham gia vào cùng một phòng, ngay cả khi máy chủ của bạn thông báo cho nó một phòng khác / mới!
Brian Ellis

92

Đối với những người (không giống như OP) đang sử dụng lib express :

http.get('*',function(req,res){  
    res.redirect('http://exmple.com'+req.url)
})

12
Đối với tín dụng phù hợp ... stackoverflow.com/questions/7450940/...
David Seholm

2
Có thể làm điều đó mà không có gói 'cấp tốc' không?
Tanaki

Cảm ơn. đây là những gì tôi cần
liza

2
không trả lời câu hỏi
Alex Jone

1
@AlexJone Nó cung cấp thêm một thông tin hữu ích. Các phản hồi trên SO không phải lúc nào cũng được coi là độc lập.
Paul Stelian

34

OP: "Tôi rất thích nếu có cách nào đó để làm điều đó mà tôi không cần phải biết địa chỉ máy chủ ..."

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

3

Trong Express bạn có thể sử dụng

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

để chuyển hướng người dùng từ máy chủ.

Để bao gồm mã trạng thái 301 hoặc 302, nó có thể được sử dụng

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

1

Nếu bạn đang sử dụng Express, câu trả lời đầy đủ nhất là

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'), () => {})

0

Bạn có thể sử dụng phương thức res.render () hoặc res.redirect () để chuyển hướng đến một trang khác bằng cách sử dụng node.js express

Ví dụ:

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

Ở đây trong phần đăng nhập, Nếu email và mật khẩu khớp trong cơ sở dữ liệu thì trang web được chuyển hướng đến dashbaord.html, nếu không chúng tôi sẽ hiển thị page-error.html bằng cách sử dụng phương thức res.redirect (). Ngoài ra, bạn có thể sử dụng res.render () để hiển thị một trang trong node.js

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.