为什么node.js(Express)不服务这条路线?以及如何解决?

问题描述 投票:0回答:1

我正在编写一个应用程序,我试图找出为什么这个登录的路由没有注册。

如果有人有更好的路由模型,他们可以共享或解决问题,请回复

import express from 'express';
const router = express.Router();

router.route('/login').post((req, res) => {
    console.log('login');
    let user = Users.getUser(req.body.email);

    if (!user) {
        console.log(`unable to find user: ${user}`);
        res.status(401).send('Unable to find username');
        return;
    }

    bcrypt.compare(req.body.pass, user.password, (err, goodComparison) => {
        if (err) {
            console.log(err);
            res.status(401);
        } else if (goodComparison) {
            // Good password, generate key, send response
            let key = Sessions.generateSession(user, token => {
                let responseData = {
                    id: user.id,
                    username: user.username,
                    email: user.email,
                    admin: user.admin,
                    token: token
                };
                res.status(200).json(responseData);
            });
            // Invalid password
        } else {
            res.status(401);
        }
    });
});

export { router };

的console.log( '登录');由于404,从未被调用,路线未被提供。

import express from 'express';

const router = express.Router();
import { router as loginRouter } from './routes/login.route';

/**
 * TODO:
 * Possibly automate routes, or json import
 */
export default {
    /** Initiate routers */
    registerRoutes: function() {
        console.log('registering routes');
        console.log(loginRouter);
        router.use('/login', loginRouter); /* HERE */
    }
};

在我的app.js中(是的,它被正确导入)

// Register routes

// Register routes
Routes.registerRoutes();

我的应用程序是404 for / login的帖子,但是如果我将路由代码直接放在app.js中就可以了

如果这是我出口路线或处理路线或任何事情的方式的问题,我已经做了很多在线搜索解决方案并且无法找到它。非常感谢您的建议和解决方案!

node.js http-status-code-404
1个回答
0
投票

使用const router = express.Router();在第二个代码块中创建的路由器从不与任何东西挂钩。它需要挂钩到附加到http服务器的快速实例。

只是单独调用router.use(...)不会对任何事情造成任何影响。该路由器必须连接到一个Express实例,该实例本身已连接到一个http服务器,该服务器已启动以便将传入的http请求发送到路由器。


此外,看起来你也试图为/login/login而不仅仅是/login创建一条路线。当你这样做:

router.use('/login', loginRouter); 

这表示无论发送到router的请求是什么,过滤掉请求,以便只有以/login开头的请求才会被发送到loginRouter。然后,在loginRouter内,你有这个:

router.route('/login').post(...)

这表示对于来到router的请求(实际上是前面代码中的loginRouter),在已经匹配的任何内容上寻找/login的额外路径。这意味着你会寻找/login/login,这可能不是你发布的内容。


仅供参考,当您在不同文件中为同一路由器使用不同的符号名称时,您的代码将更加难以理解。如果您要在一个地方使用loginRouter,那么对于该特定路由器,请在所有文件中使用相同的名称。您的代码将更容易混淆,并且不太可能让某人犯错误。你把它称为loginRouter在一个地方,router在另一个地方。然后,你有其他路由器,你也称为router。很混乱。

© www.soinside.com 2019 - 2024. All rights reserved.