【问题标题】:Node.js not redirecting properlyNode.js 没有正确重定向
【发布时间】:2020-05-13 18:18:03
【问题描述】:

我是使用 Node js 的初学者。我已经开发了一个使用 PHP 获取服务器的网站,并且正在尝试一些新的东西。那么谁能告诉我我在这里做什么?

var mysql = require('mysql');
var express = require('express');
var session = require('express-session');
var bodyParser = require('body-parser');
var path = require('path');

var connection = mysql.createConnection({
    host    : 'localhost',
    user    : 'username',
    password: 'password',
    database: 'nodelogin'
});

var app = express();
app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true
}));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.get('/', (request, response) => {
    response.sendFile(path.join(__dirname + '/login.html'));
});

app.post('/auth', (request, response) => {
    var username = request.body.username;
    var password = request.body.password;
    if (username && password) {
        connection.query('SELECT * FROM accounts WHERE username = ? AND password = ?', [username, password], (error, results, fields) => {
            if (results.length > 0) {
                request.session.loggedin = true;
                request.session.username = username;
                response.redirect('/home'); // This works
            } else {
                request.session.loggedin = false;
                response.send('<script>alert("Incorrect Username and/or Password!")</script>');
                response.redirect('/home'); // This doesnt work
            }
            response.end();
        });
    } else {
        response.send('Please enter Username and Password!');
        response.end();
    }
});

app.get('/home', (request, response) => {
    if (request.session.loggedin) {
        response.send('Welcome back, ' + request.session.username + '!');
    } else {
        response.send('Please login to view this page!');
    }
    response.end();
});

app.listen(3000);

我已经放置了我的整个 app.js,但在授权用户登录后,我试图重定向到在 if 情况下有效但在 else。这是在代码中的查询之后。我得到的错误如下,我真的无法理解它:

C:\xampp\htdocs\students\node_modules\mysql\lib\protocol\Parser.js:437
      throw err; // Rethrow non-MySQL errors
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
←[90m    at ServerResponse.setHeader (_http_outgoing.js:485:11)←[39m
    at ServerResponse.header (C:\xampp\htdocs\students\node_modules\←[4mexpress←[24m\lib\response.js:771:10)
    at ServerResponse.location (C:\xampp\htdocs\students\node_modules\←[4mexpress←[24m\lib\response.js:888:15)
    at ServerResponse.redirect (C:\xampp\htdocs\students\node_modules\←[4mexpress←[24m\lib\response.js:926:18)
    at Query.<anonymous> (C:\xampp\htdocs\students\app.js:39:26)
    at Query.<anonymous> (C:\xampp\htdocs\students\node_modules\←[4mmysql←[24m\lib\Connection.js:526:10)
    at Query._callback (C:\xampp\htdocs\students\node_modules\←[4mmysql←[24m\lib\Connection.js:488:16)
    at Query.Sequence.end (C:\xampp\htdocs\students\node_modules\←[4mmysql←[24m\lib\protocol\sequences\Sequence.js:83:24)
    at Query._handleFinalResultPacket (C:\xampp\htdocs\students\node_modules\←[4mmysql←[24m\lib\protocol\sequences\Query.js:149:8)
    at Query.EofPacket (C:\xampp\htdocs\students\node_modules\←[4mmysql←[24m\lib\protocol\sequences\Query.js:133:8) {
  code: ←[32m'ERR_HTTP_HEADERS_SENT'←[39m
}
[nodemon] app crashed - waiting for file changes before starting...

【问题讨论】:

  • send函数后不能重定向
  • 它只是说你不能在发送后重定向。使用 PHP 时,您会遇到同样的问题,即臭名昭著的“标头已发送”错误。原因是任何语言的 HTTP 重定向都是作为标头实现的。发送数据后,您将无法返回并更改标题
  • 那么如何显示用户名/密码错误并一起重定向?
  • 你不能在 res.send() 之后使用重定向。您可以将其添加到 req 以将其发送到家
  • 看看会话闪存,这是您需要的良好行为。

标签: node.js


【解决方案1】:

您先发送响应,然后尝试重定向,这会导致错误,因为一旦发送响应,连接就会关闭。

尝试在 post 回调中使用 'next' 中间件,例如

    app.post("auth",(req,res,next)=>{
    /* Your auth logic and in the else part use next for redirection */ 

    next('redirectionRoute') 

/* Or you can keep res.redirect() and remove the res.send() in else and use appropriate route handler for the redirect route - This is better way * /
    })

【讨论】:

    【解决方案2】:

    在这里,您尝试在使用 res.send 之后使用 res.redirect 在响应中发送 HTML 字符串。 res.send 来自 Express 框架,将数据作为参数。 res.send 然后会检查参数的结构,并设置相应的头部以及头部中的 ETag 属性。它本质上实现了 res.write、res.setHeaders,最后是 res.end,它来自 Nodejs 核心并导致响应“关闭”,有效地渲染了许多响应对象方法不可用,因为它们需要响应对象变得“开放”。 res.redirect 是一种在调用 res.end 后无法使用的方法(即响应已关闭/“结束”)。在其他框架中,线程专用于 http 响应,并在响应本身关闭时停止。这不是 Nodejs 中的情况。

    我会考虑通过res.send 向客户端发送响应,客户端可以寻找该响应作为执行重定向的信号,可能使用window.location 之类的东西并触发警报。

    我发现这两个线程非常有帮助:

    【讨论】:

      猜你喜欢
      • 2020-02-10
      • 2018-04-14
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2019-09-09
      • 2019-03-25
      相关资源
      最近更新 更多