【问题标题】:RangeError: Invalid status code: 0 node jsRangeError:无效的状态代码:0节点js
【发布时间】:2017-08-01 18:57:30
【问题描述】:

我被这个问题困住了,看看有没有人可以帮忙。 我有这个 Node.js 应用程序,当我提交表单并转到注册部分时,我收到此错误:

RangeError: Invalid status code: 0
    at ServerResponse.writeHead (_http_server.js:192:11)
    at ServerResponse._implicitHeader (_http_server.js:157:8)
    at ServerResponse.OutgoingMessage.end (_http_outgoing.js:574:10)
    at ServerResponse.send (C:\projects\authentication\node_modules\express\lib\response.js:211:10)
    at ServerResponse.json (C:\projects\authentication\node_modules\express\lib\response.js:256:15)
    at C:\projects\authentication\app.js:24:7
    at Layer.handle_error (C:\projects\authentication\node_modules\express\lib\router\layer.js:71:5)
    at trim_prefix (C:\projects\authentication\node_modules\express\lib\router\index.js:315:13)
    at C:\projects\authentication\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\projects\authentication\node_modules\express\lib\router\index.js:335:12)

这里是 app.js

var express = require('express');
var app = express();
var bodyParser = require('body-parser');

// include routes
var routes = require('./routes/router');
app.use('/', routes);
app.use('/register', routes);

// serve static files from /public
app.use(express.static(__dirname + '/template'));

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('File Not Found');
  err.status = 404;
  next(err);
});

// error handler
// define as the last app.use callback
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.json('error', {
    message: err.message,
    error: {}
  });
});

/////// JSON parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.use(function (req, res) {
  res.setHeader('Content-Type', 'text/plain');
  res.write('you posted:\n');
  res.end(JSON.stringify(req.body, null, 2));
});


// listen on port 3000 setting server
app.listen(3000, function () {
  console.log('Express app listening on port 3000');
});


to handle the http request i have a route.js file, wich is like this:
var express = require('express');
var router = express.Router();
var path = require('path');


// GET /
router.get('/', function(req, res, next) {
   //res.setHeader('Content-type','text/plain');
   return res.sendFile(path.join(__dirname + "/../index.html"));
});

router.post('/register', function(req, res){

    //console.log(req.body);
    return res.send(req.body.email);
    /*
    if (req.body.email &&
      req.body.username &&
      req.body.password &&
      req.body.passwordConf) {
          var userData = {
            email: req.body.email,
            username: req.body.username,
            password: req.body.password,
            passwordConf: req.body.passwordConf
          };
  //use schema.create to insert data into the db
      User.create(userData, function (err, user) {
        if (err) {
          return next(err);
        } else {
          return res.redirect('/profile');
        }
      });
    }*/
});


module.exports = router;

当我尝试通过根“/”上的 get 请求访问时,它会用一个表单打开 html,这个表单会转到“/register”,所以我得到了错误,我如何获取 html 文件有点奇怪可以通过 root 获取,但是当我尝试访问“/注册”时,我只得到这个错误,已经尝试了很多东西,我不知道我做错了什么,希望我能得到一些帮助。

HTML 文件

</head>
<body>
    <form action="/register" method="post">
        <div>
            <label for="email">email:</label>
            <input type="email" name="email" id="email" />
        </div>
        <div>
            <label for="username">username:</label>
            <input type="text" name="username" id="username" />
        </div>
        <div>
            <label for="password">password:</label>
            <textarea id="password" name="password"></textarea>
        </div>
        <div>
            <label for="passwordConf">password again:</label>
            <textarea name="passwordConf" id="passwordConf"></textarea>
        </div>
        <div class="button">
            <button type="submit">submit</button>
        </div>
    </form>
</body>
</html>

【问题讨论】:

    标签: javascript node.js http express


    【解决方案1】:

    查看堆栈跟踪:

    RangeError: Invalid status code: 0
        at ServerResponse.writeHead (_http_server.js:192:11)
        ...
        at C:\projects\authentication\app.js:24:7
    

    好的,所以错误是在app.js的第24行引起的,就是这个:

      res.json('error', {
        message: err.message,
        error: {}
      });
    

    Express 试图将 'error' 解释为状态码(因为旧版本的 Express 接受 res.json(status, obj),已被弃用),并且因为它不是一个看起来像数字的东西,所以在内部它被转换为数字“0”,这是一个无效的状态码,因此是错误的。

    我猜你是这个意思:

      res.json({
        message: err.message,
        error: {}
      });
    

    编辑:至于您的其他错误,您需要确保 body-parser 中间件在您的路由之前声明

    var bodyParser = require('body-parser');
    
    /////// JSON parser
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    
    // include routes
    var routes = require('./routes/router');
    app.use('/', routes);
    app.use('/register', routes);
    

    否则,请求在到达您的路由处理程序之前将不会通过该中间件。

    【讨论】:

    • 哇,那是一段处理错误的代码,事实上你是对的,现在我得到了正确的错误信息,有点讽刺,这个问题解决了,但第一个错误仍然存在...现在我在访问 '/register' {"message":"Cannot read property 'email' of undefined","error":{}} 时收到此消息...看起来我没有收到来自发布请求的信息或类似的想法。
    • 伙计,这很好,你在帮助,但它仍然不完美,如果你能再给我一个想法,因为现在我收到一条没有错误但消息不正确的消息,我只收到电子邮件信息。像这样:{"email":"teste@btc.com"}
    • @AndreyViktorKandauroff 而不是什么?您的问题显示的代码使用res.send(req.body.email)
    • 是的,抱歉,我发布了 HTML 文件,即使尝试获取 req.body,我仍然只收到电子邮件,当我尝试 req.body.password 或用户名时,我得到一个空白页
    • 所以req.body 只有电子邮件地址?如图所示,POST /register 的路由除了发回电子邮件地址之外什么也没做,这就是您所说的“空白页”吗?
    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多