首页 > 解决方案 > NodeJS重定向到带有NodeError的有效路由抛出错误:无效状态代码

问题描述

我的节点应用程序需要设置一个特定的session令牌/字段来执行设置。

这种方法和其他authentication类型方法的问题是我的路由器文件之外的任何重定向似乎都因同样的原因而失败。

示例代码 (mcve)(您需要为此设置快速会话)

  1. 创建文件auth.js

  2. 添加函数并将其导出:

    const checkAdminAuthenticatedSetup = () => (req, res, next) => {
        if(req.session.authenticated !== true) {
            return res.status(302).redirect('/setup/auth', {message: "Please enter password to continue setup"})
        } else {
            next();
        } 
    }
    
    module.exports = {
        checkAdminAuthenticatedSetup
    }
    
  3. 在您的路由器文件中,const auth = require("auth")

  4. 对于某些路线,请执行以下操作:

    router.get('/financial',
        auth.checkAdminAuthenticatedSetup(),        <---------- this line should check if there is a req.session.authenticated (= true) value, else redirect to another page /setup/auth
        function (req, res, next) {
             res.render("setup-banking-information");
        });
    

问题

此重定向“失败”并显示以下消息:

>>> console.log(err)
NodeError: Invalid status code: [object Object] at ServerResponse.writeHead (_http_server.js:209:11) at ServerResponse.writeHead (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\on-headers\index.js:44:26) at ServerResponse.writeHead (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\on-headers\index.js:44:26) at ServerResponse._implicitHeader (_http_server.js:200:8) at write_ (_http_outgoing.js:585:9) at ServerResponse.end (_http_outgoing.js:702:5) at ServerResponse.end (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express-session\index.js:355:19) at ServerResponse.redirect (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\response.js:947:10) at C:\Users\CybeX\WebstormProjects\awesome-app\utils\auth.js:30:32 at Layer.handle [as handle_request] (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\layer.js:95:5) at next (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\layer.js:95:5) at C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\index.js:281:22 at Function.process_params (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\index.js:335:12) at next (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\index.js:275:10) at Function.handle (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\index.js:174:3) at router (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\index.js:47:12) at Layer.handle [as handle_request] (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\index.js:317:13) at C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\index.js:284:7 at Function.process_params (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\router\index.js:335:12)
stack = "RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: [object Object]\n at ServerResponse.writeHead (_http_server.js:209:11)\n at ServerResponse.writeHead (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\on-headers\index.js:44:26)\n at ServerResponse.writeHead (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\on-headers\index.js:44:26)\n at ServerResponse._implicitHeader (_http_server.js:200:8)\n at write_ (_http_outgoing.js:585:9)\n at ServerResponse.end (_http_outgoing.js:702:5)\n at ServerResponse.end (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express-session\index.js:355:19)\n at ServerResponse.redirect (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\response.js:947:10)\n at C:\Users\CybeX\WebstormProjects\awesome-app\utils\auth.js:30:32\n at Layer.handle [as handle_request] (C:\Users\CybeX\WebstormProjects\awesome-app\node_modules\express\lib\ro"… (length: 2,501)
message = "Invalid status code: [object Object]"
__proto__ = RangeError {constructor: , name: , code: }
[[StableObjectId]] = 3

每次发生此重定向时(在路由器文件之外),此方法(内部app.js)都会被命中

// error handler
app.use((err, req, res, next) => {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

此外,我注意到在“渲染”error.pug页面之后,浏览器只是挂在它最初尝试加载的页面上,而不是在浏览器中渲染error页面,浏览器只是永远加载。

标签: node.jsexpress

解决方案


问和回答。这是一个简单的疏忽。

Express 不允许通过重定向方法解析附加信息,例如(在我的情况下)用于呈现页面的附加参数{ message: "..."}

格式/语法为redirect()

res.redirect([status,] path)

就我而言,我应该将其添加为一条消息。


推荐阅读