Node.js未正确重定向
我是一个使用NodeJS的初学者。我用PHP开发了一个带有服务器抓取的网站,正在尝试一些新的东西。有人能告诉我我在这里干什么吗Node.js未正确重定向,node.js,Node.js,我是一个使用NodeJS的初学者。我用PHP开发了一个带有服务器抓取的网站,正在尝试一些新的东西。有人能告诉我我在这里干什么吗 var mysql = require('mysql'); var express = require('express'); var session = require('express-session'); var bodyParser = require('body-parser'); var path = require('path'); var connec
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);
var mysql=require('mysql');
var express=需要(“express”);
var会话=需要(“快速会话”);
var bodyParser=require('body-parser');
var path=require('path');
var connection=mysql.createConnection({
主机:“localhost”,
用户:“用户名”,
密码:“password”,
数据库:“nodelogin”
});
var-app=express();
应用程序使用(会话)({
秘密:“秘密”,
雷萨夫:是的,
saveUninitialized:true
}));
use(bodyParser.urlencoded({extended:true}));
use(bodyParser.json());
app.get(“/”,(请求、响应)=>{
sendFile(path.join(_dirname+'/login.html');
});
app.post('/auth',(请求、响应)=>{
var username=request.body.username;
var password=request.body.password;
如果(用户名和密码){
connection.query('从用户名=?和密码=?'的帐户中选择*,[用户名,密码],(错误,结果,字段)=>{
如果(results.length>0){
request.session.loggedin=true;
request.session.username=用户名;
response.redirect('/home');//这很有效
}否则{
request.session.loggedin=false;
response.send('alert(“用户名和/或密码不正确!”));
response.redirect('/home');//这不起作用
}
response.end();
});
}否则{
response.send('请输入用户名和密码!');
response.end();
}
});
app.get('/home',(请求、响应)=>{
if(request.session.loggedin){
response.send('Welcome back',+request.session.username+'!');
}否则{
response.send('请登录查看此页面!');
}
response.end();
});
app.listen(3000);
我安装了我的整个app.js,但在授权用户登录后,我试图重定向到“/home”,它在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...
C:\xampp\htdocs\students\node\u modules\mysql\lib\protocol\Parser.js:437
抛出错误;//重新显示非MySQL错误
^
错误[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头
←[ServerResponse.setHeader上的90m(_http_outgoing.js:485:11)←[39m
在ServerResponse.header(C:\xampp\htdocs\students\node\u模块\←[4M快车←[24m\lib\response.js:771:10)
在ServerResponse.location(C:\xampp\htdocs\students\node\u模块\←[4M快车←[24m\lib\response.js:888:15)
在ServerResponse.redirect(C:\xampp\htdocs\students\node\u模块\←[4M快车←[24m\lib\response.js:926:18)
在查询时。(C:\xampp\htdocs\students\app.js:39:26)
在查询时。(C:\xampp\htdocs\students\node\u模块)\←[4MYSQL←[24m\lib\Connection.js:526:10)
在查询时。\回调(C:\xampp\htdocs\students\node\u模块\←[4MYSQL←[24m\lib\Connection.js:488:16)
在Query.Sequence.end(C:\xampp\htdocs\students\node\u模块\←[4MYSQL←[24m\lib\protocol\sequences\Sequence.js:83:24)
查询时。\u handleFinalResultPacket(C:\xampp\htdocs\students\node\u模块\←[4MYSQL←[24m\lib\protocol\sequences\Query.js:149:8)
在Query.EofPacket(C:\xampp\htdocs\students\node\u模块\←[4MYSQL←[24m\lib\protocol\sequences\Query.js:133:8){
代码:←[32m'ERR\u HTTP\u头\u发送'←[39m
}
[nodemon]应用程序崩溃-正在等待文件更改,然后再启动。。。
在这里,您尝试在使用res.send
后使用res.redirect
在响应中发送HTML字符串。res.send
来自Express框架,并将数据作为参数。res.send
然后将检查参数的结构,并设置相应的头和ETag a标头中的属性。它基本上实现res.write、res.setHeaders,最后实现res.end,它来自Nodejs核心,导致响应“关闭”,有效地使许多响应对象方法无法使用,因为它们要求响应对象“打开”res.redirect
是一种在调用res.end
后无法使用的方法(即响应已关闭/已“结束”)。在其他框架中,线程专用于http响应,并在响应本身关闭时停止。Nodejs中不是这种情况
我会考虑通过<代码> RES.Enter <代码>向客户端发送一个响应,即客户端可以寻找一个信号来进行重定向,可能使用诸如“代码>窗口”。位置< /代码>并触发警报。
我发现这两个线程非常有用:res.send
发送响应中的HTML字符串后,尝试使用res.redirect
。res.send
来自Express框架,并将数据作为参数。res.send
然后将检查参数的结构,并设置相应的头和ETag att它基本上实现res.write、res.setHeaders,最后实现res.end,它来自Nodejs核心,导致响应“关闭”,有效地使许多响应对象方法无法使用,因为它们要求响应对象“打开”res.redirect
是一种在调用res.end
后无法使用的方法(即响应已关闭/已“结束”)。在其他框架中,线程专用于http响应,并在响应本身关闭时停止。Nodejs中不是这种情况
< P> >我想考虑通过<代码> RES.Enter < /Cord>向客户端发送一个响应,即客户端可以寻找一个信号来进行重定向,也许使用S。
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 * /
})