Node.js表示res.redirect无法正常工作

时间:2016-08-03 16:02:28

标签: node.js

我目前正在编写一个需要用户身份验证的应用程序。登录到应用程序时,节点服务器应将用户重定向到主页面。不幸的是,我在尝试这样做时遇到了问题。

这是我在Node.js中的代码:

//import necessary modules
var path = require("path");
var http = require("http");
var express = require("express");
var session = require("express-session");

var port = 8080;
var app = express();
var conString = "postgres://postgres:admin@localhost:5432/db_invoice_kuga";

/**
 * Middleware components.
 * The session middleware is used to create sessions for
 * user authentication.
 * The static middleware is used to serve
 * the static file in the frontend folder.
 */

//use sessions for authentication
app.use(session({
    secret: "2C44-4D44-WppQ38S",
    resave: true,
    saveUninitialized: true
}));

//check authentication
app.use(function(req, res, next) {
    if(req.session && req.session.user) {
       next();
    } else {
        if(req.url.indexOf("/login/") === -1 && req.url.indexOf("/loginPage") === -1) {
            res.redirect("/loginPage");
        } else {
            next();
        }
    }
});

//static middleware
app.use(express.static(__dirname + "/frontend"));

/**
 * Routes define the endpoints for the application.
 * There is a specific file for customer routes, invoice routes, ...
 */

//include routes
require("./routes/routesCustomer.js")(app, conString);

//login and logout routes
app.get("/loginPage", function(req, res) {
    res.sendFile(path.join(__dirname, "frontend", "login.html"));
});

app.get("/", function(req, res) {
    res.sendFile(path.join(__dirname, "frontend", "index.html"));
});

/**
 * Logs the user in.
 * @name /login/:username/:password
 * @param username (obligatory)
 * @param password (obligatory)
 */
app.get("/login/:username/:password", function(req, res) {
    var username = req.params.username;
    var password = req.params.password;

    if(username === "Daniel" && password === "test") {
        req.session.user = "Daniel";
        res.redirect("/");
    } else {
        res.status(400).json({
            "loggedin": false
        });
    }
});

/**
 * Logs the user out.
 * @name /logout
 */
app.get("/logout", function(req, res) {
    req.session.destroy();
    res.redirect("/loginPage");
});

/**
 * Bind the server to the port and
 * start the application.
 */

//create the server and bind it to the port
http.createServer(app).listen(port, function() {
    console.log("Server listening on port " + port);
});

我的问题是路由“/ login /:username /:password”。那里“res.redirect('/')”不起作用。虽然redirect()在其他路由中运行良好......

有人知道可能出现什么问题吗?也许还有一种更好的方法来进行用户身份验证。我很感激建议:)

非常感谢您提前。 丹尼尔

1 个答案:

答案 0 :(得分:0)

这就是我的代码现在的样子:



/**
 * Created by Daniel on 27.07.2016.
 * This file contains the setup of the server.
 */

"use strict";

//import necessary modules
var path = require("path");
var http = require("http");
var colors = require("colors");
var express = require("express");
var stormpath = require("express-stormpath");

var app = express();
var port = 8080;
var conString = "postgres://postgres:admin@localhost:5432/db_invoice_kuga";

console.log("\nSETTING UP THE SERVER...\n" +
"========================\n");

//MIDDLEWARE
//log routes
app.use(function(req, res, next) {
    console.log(colors.yellow(req.method + "\t" + req.url));
    next();
});

//configure stormpath
app.use(stormpath.init(app, {
    client: {
        apiKey: {
            file: "./apiKey.properties"
        }
    },
    web: {
        login: {
            enabled: true
        },
        logout: {
            enabled: true
        },
        me: {
            enabled: false
        },
        oauth2: {
            enabled: false
        },
        register: {
            enabled: false
        }
    },
    application: {
        href: "https://api.stormpath.com/v1/applications/onkfEfUjnUWO6qMg4y5J7",
    }
}));

//serve static files in frontend folder
app.use(stormpath.loginRequired, express.static(__dirname + "/frontend"));

//ROUTES
//include routes
console.log("Including routes...");
require("./routes/routesCustomer.js")(app, conString);

console.log(colors.green("Success.\n"));

//BIND APP TO PORT
//create the server and bind app to the port
console.log("Binding application to port...");
http.createServer(app).listen(port, function() {
    console.log(colors.green("Success. Magic happens on port " + port + "!"));
});

app.on("stormpath.ready", function() {
    console.log(colors.green("Stormpath ready!\n"));
    console.log(colors.cyan(">> Application ready <<\n"));
    console.log(colors.magenta("Requests:\n=========\n"));
});
&#13;
&#13;
&#13;

使用express-stormpath时,

登录/注销路由会自动添加到应用程序中。