Запросы 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) возвращает req.body: [object Object]; 2) на самом деле у меня такая же проблема, независимо от того, делаю ли я POST-запрос от клиента через POSTMAN
Если вы видите [object Object], это означает, что клиент не преобразовал параметры в JSON, он попытался отправить объект без его преобразования. Вот что вы получите, если преобразуете объект в строку. См. stackoverflow.com/questions/4750225/…
RecordSearchBar() функция действительно испорчена. Кстати, функции, объявленные в верхнем регистре, рассматриваются как class. Это один из методов создания класса в JS.
привет @jkalandarov, насколько я понимаю, это стандартная функция компонента реакции. имя в верхнем регистре - это то, что ожидается для компонента реакции
Ваш обработчик app.post("/users" не использует res. Это вообще не служит ответом. Ваш код не делает res.send или res.status или что-то типичное.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Решено! Мне пришлось исправить преобразование типа тела запроса с помощью 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));
}
})
1) Попробуйте
console.info(req.body). 2. Поделитесь клиентским кодом.