Запрос POST возвращает нулевые значения (node.js)

Запросы POST возвращают null. Значения req.body..... не определены. Я попытался проверить, что он поступает на сервер в формате JSON, но я не уверен, что делаю это правильно.... :-( Большое спасибо за помощь, амигос!

var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
const bodyParser = require('body-parser');
const cors = require("cors");

const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');

var app = express();  
app.set('view engine', 'ejs')
app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(bodyParser.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

const { MongoClient } = require("mongodb");
const uri = "mongod...the string is ok....y";
const client = new MongoClient(uri);
const database = client.db('holdocsDB');
const records = database.collection('records');

app.post("/users", async (req, res) => {
    console.info('hola pooost');
    console.info("req.body.age: " + req.body.age);

    try {
        // create a document to insert
        const newRecord = {
            firstName: req.body.firstName,
            age: req.body.age

        }
        const result = await records.insertOne(newRecord);
        console.info(`A document was inserted with the _id: ${result.insertedId}`);
        // } finally {
        //   await client.close();
        // }
    } catch {
        (e) => (console.error(e));
    }
});

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    next(createError(404));
});

// error handler
app.use(function(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.json('error');
});

module.exports = app;

Когда я жестко кодирую некоторые значения для публикации в экспресс-маршруте POST (вместо извлечения значений из req.body) - это работает хорошо.

    function RecordSearchBar() {

        const [form, setForm] = useState({
            firstName: "",
            age: 0
        });

        // const navigate = useNavigate();

        function updateForm(value) {
            return setForm((prev) => {
                return { ...prev, ...value };
            });
        }

        async function onSubmit(e) {
            e.preventDefault();
            const newPerson = { ...form };
            
            await fetch("http://localhost:3001/users/add", {
                method: "POST",
                headers: {
                "Content-Type": "application/json",
                },
                body: JSON.stringify(newPerson),
            })
            .catch(error => {
                window.alert(error);
                return;
            });
            
            setForm({ firstName: "", age: ""});
            // navigate("/users");
        }   

        return (
            <>
                <h2>Search records:</h2>  
                <form onSubmit = {onSubmit} id='search-form'>
                    <div className = "form-group">
                        <label htmlFor = "firstName">First name</label>
                        <input
                        type = "text"
                        className = "form-control"
                        id = "name"
                        value = {form.name}
                        onChange = {(e) => updateForm({ name: e.target.value })}
                        />
                    </div>
                    <div className = "form-group">
                        <label htmlFor = "age">Age</label>
                        <input
                        type = "number"
                        className = "form-control"
                        id = "position"
                        value = {form.position}
                        onChange = {(e) => updateForm({ position: e.target.value })}
                        />
                    </div>
                    <div className = "form-group">
                        <input
                        type = "submit"
                        value = "Add record"
                        className = "btn btn-primary"
                        />
                    </div>
                </form>
        
            </>

1) Попробуйте console.info(req.body). 2. Поделитесь клиентским кодом.

Evert 17.01.2023 18:14

Спасибо за ответ! 1) console.info(req.body) возвращает req.body: [object Object]; 2) на самом деле у меня такая же проблема, независимо от того, делаю ли я POST-запрос от клиента через POSTMAN

Toto 17.01.2023 18:22

Если вы видите [object Object], это означает, что клиент не преобразовал параметры в JSON, он попытался отправить объект без его преобразования. Вот что вы получите, если преобразуете объект в строку. См. stackoverflow.com/questions/4750225/…

Barmar 17.01.2023 18:23
RecordSearchBar() функция действительно испорчена. Кстати, функции, объявленные в верхнем регистре, рассматриваются как class. Это один из методов создания класса в JS.
jkalandarov 17.01.2023 19:27

привет @jkalandarov, насколько я понимаю, это стандартная функция компонента реакции. имя в верхнем регистре - это то, что ожидается для компонента реакции

Toto 17.01.2023 19:37

Ваш обработчик app.post("/users" не использует res. Это вообще не служит ответом. Ваш код не делает res.send или res.status или что-то типичное.

Wyck 17.01.2023 20:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решено! Мне пришлось исправить преобразование типа тела запроса с помощью JSON.parse() и JSON.stringify():

app.post("/users", async (req, res) => {
  console.info("req.body: " + JSON.stringify(req.body));

  let newRecordStringified = JSON.stringify(req.body)
  try {
    // create a document to insert
    const newRecord = {
      firstName: req.body.firstName,
      age: req.body.age
      // firstName: "Mamile",
      // age: 33
    }
    const result = await             records.insertOne(JSON.parse(newRecordStringified));
    console.info(`A document was inserted with the _id: ${result.insertedId}`);
  // } finally {
  //   await client.close();
  // }
   } catch {
     (e) => (console.error(e));
   }
})

Другие вопросы по теме