Node.js未正确重定向

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

我是一个使用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 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 * /
    })