【问题标题】:Express - 400 bad request on POST and PUTExpress - POST 和 PUT 的 400 错误请求
【发布时间】:2020-05-09 21:59:12
【问题描述】:

我需要一些帮助,因为我是 Node.js 和 express 的新手。我在 Postman 上测试了以下代码

const Joi = require('@hapi/joi');
const bodyParser = require('body-parser');

// Load the express framework
const express = require('express');
const app = express();

app.use(express.json());
app.use(bodyParser.json());
app.use(express.urlencoded({ extended: true }));

// temp array
const courses = [
    {id: 1, title: 'Learning Node.js'},
    {id: 2, title: 'How to become a full stack dev'},
    {id: 3, title: 'Master your Javascript skills'}
];
app.post('/api/courses', (request, response) => {
    let error = validateCourse(request.body);
    if (error) {
        response.status(400).send(error.details[0].message); // *
        return;
    }

    let course = {
        id: courses.length + 1,
        name: request.body.name
    };

    // TODO save
    console.log('TODO save the record');

    response.send(course);
});

app.put('/api/courses/:id', (request, response) => {
    let course = courses.find(c => c.id === parseInt(request.params.id));
    if(!course) response.status(404).send('Oops!');

    let { error } = validateCourse(request.body);
    if (error) {
        response.status(400).send(error.details[0].message);
        return;
    }

    // TODO save
    console.log('TODO save the record');

    response.send(course);
});


function validateCourse(course) {
    let schema = Joi.object({
        name: Joi.string().min(4).required()
    });
    console.log(course);
    return schema.validate(course);
}

当我发出 PUT 或 POST 请求并提供 name(即验证应该通过)时,我收到 400 错误。

在 POST 请求中,我在控制台中看到以下内容,指的是我的星号 (*) 所在的位置

TypeError: Cannot read property '0' of undefined
    at /app/index.js:50:48

在 PUT 请求中,我在控制台中看到以下内容 Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

在这两种情况下,我在 validateCourse 函数中的 console.log 都显示一个空对象 {}

这是邮递员的截图

任何想法我做错了什么?

【问题讨论】:

  • 在您的错误处理中,您应该return 停止该功能,否则您将尝试发送响应 2 次,因此“发送后无法设置标头”
  • 我在if (error) 块中添加了返回值,但即使我在name 中提交了值,验证仍然失败
  • 就像在put中一样,在post中你需要像这样破坏错误:let { error } = validateCourse(request.body);
  • 当我尝试调试它时,我注意到 request.body 始终设置为 undefined 所以我实际上从未发送带有 name 的请求任何想法为什么会发生这种情况?我在加载 express 后在文件顶部使用app.use(express.json());,而且我可以看到我在 node_modules 中有 body-parser
  • 您可以将您的主文件(索引、应用程序或 server.js)添加到问题中吗?

标签: javascript node.js express request postman


【解决方案1】:
let course = courses.find(c => c.id === parseInt(request.params.id))
if(!course) return response.status(404).send('Oops!');

let { error } = validateCourse(request.body);
if (error) {
    return response.status(400).send(error.details[0].message);
}

response.send(course);

这必须解决您在 PUT 请求中遇到的错误。

【讨论】:

    【解决方案2】:

    ?‍?我已经测试过这个code,我的意思是你可以试试下面的代码?:

    app.post('/api/courses', (request, response) => {
      let { error } = validateCourse(request.body);
    
      if (error) {
          response.status(400).send(error.details[0].message); // *
      }
    
      let course = {
          id: courses.length + 1,
          name: request.body.name
      };
    
      // TODO save
      console.log('TODO save the record');
    
      response.send(course);
    });
    
    app.put('/api/courses/:id', (request, response) => {
      let course = courses.find(c => c.id === parseInt(request.params.id));
    
      if(!course) response.status(404).send('Oops!');
    
      let { error } = validateCourse(request.body);
    
      if (error) {
          response.status(400).send(error.details[0].message);
      }
    
      // TODO save
      console.log('TODO save the record');
    
      response.send(course);
    });
    
    
    function validateCourse(course) {
      let schema = Joi.object({
          name: Joi.string().min(4).required()
      });
      console.log(course);
      return schema.validate(course);
    }
    

    希望对你有帮助?。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2018-06-14
      相关资源
      最近更新 更多