为什么node.js(Express)不提供此路由?以及如何解决?

时间:2018-06-26 03:28:28

标签: node.js http-status-code-404

我正在编写一个应用程序,并且试图找出为什么登录后的这种方式未注册。

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

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('login'); 由于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();

我的应用程序正在为/ login编写404帖子,但是如果我将路由代码直接放在app.js中,它将起作用

如果这是我导出路线或处理路线或其他任何方式的问题,则我已经在网上进行了大量搜索以寻找解决方案,但找不到。建议和解决方案非常感谢!

1 个答案:

答案 0 :(得分:0)

在第二个代码块中使用const router = express.Router();创建的路由器永远不会挂接到任何东西。需要将其挂接到连接到http服务器的Express实例。

仅调用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。非常令人困惑。