node.js - 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...
解决方案
在这里,您尝试使用res.redirect
after 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
并触发警报。
我发现这两个线程非常有帮助:
推荐阅读
- c# - 如何使 FlowDocumentPageViewer 可编辑?
- docker - “docker logs container-id | tail -10”是一个有效的命令吗?
- php - 在类的构造函数中初始化树枝
- java - 以递归方式将列表的元素与以下元素进行比较
- c# - 通过 C# 程序从 SQL Server 数据库中删除记录的问题
- javascript - 如何在 React 中的鼠标位置呈现自毁段落?
- python-3.x - TypeError:无法将系列转换为
- javascript - RegExp 在不同环境中的行为是否不同?
- msbuild - 为什么 csproj 的版本与安装的 nuget 不同?
- python - ORA-00936: 使用 pyodbc 从 SQL 服务器提取特定数据时缺少表达式