首页 > 解决方案 > Node.js 没有正确重定向

问题描述

我是使用 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无效的“/home” 。这是在代码中的查询之后。我得到的错误如下,我真的无法确定它的正面或反面:

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...

标签: node.js

解决方案


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

res.send我会考虑通过客户端可以寻找的信号来向客户端发送响应以进行重定向,也许使用类似的东西window.location并触发警报。

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


推荐阅读