Quiero enviar algunos datos a mi base de datos MongoDB, pero en router.post mi req.body está vacío, si uso cosas que puse en mi función de envío en User(req.body) en lugar de req.body data a mi base de datos MongoDB correctamente.
Este es mi enrutador que uso, router.get . funciona bien, devuelve las tablas de la base de datos correctamente en la página /api :
const router = require("express").Router(); const User = require("./model/models"); const parser = require("body-parser").json(); router.get("/", async (req, res) => { const data = await User.find({}); res.json(data); }); router.post("/",parser,async (req, res) => { console.log('1') console.log(req.body) console.log('2') parser.v await User(req.body).save(); res.json({"msg": "ok"}); }); module.exports = router Este es mi código de archivo index.js :
const bodyParser = require('body-parser'); const express = require('express'); const app = express(); const parser = require("body-parser").json(); var path = require('path'); app.use(express.urlencoded(true)); app.use(express.json()); app.use(parser); app.use('/',require("./routes/routes")) app.use(express.static(__dirname +'/public')) app.use("/api", require('./data/api')) app.listen(5000,function(){ console.log('server is alive') })Esta es la función que uso para enviar datos:
const btn1 = document.getElementById('btnEnter') let Login = "123" btn1.addEventListener('click' ,e=>{ send({newsTxT : "someTextHere",newsZag:"someZag",author:"SomeAuthor"}) }) const send = async(body) => { let res = await fetch("/api", { method: "post", header: { "Content-Type": "application/json", "Accept": "application/json" }, body: JSON.stringify(body) }); let data = await res.json(); console.log(data) }Lo siguiente funcionó bien:
const express = require("express") const app = express() const router = express.Router() router.use(express.json()) app.use(router) router.post('/api/user', function(req, res) { // ... } Veo que la diferencia puede estar usando: app.use(router)
Tenga en cuenta que en el código anterior la declaración:
router.use(express.json()) se puede reemplazar con (usando el body-parser ):
const bodyParser = require('body-parser') router.use(bodyParser.json()) Esto funcionó bien con la versión express 4.17.1, body-parser versión 1.19.0 y NodeJS versión 12.18.3
Lo único extraño que veo es que está utilizando un json body-parser y también express.json() ambos técnicamente hacen lo mismo, pero body-parser está obsoleto, por lo que podría estar causando un error.
Además, no tiene que volver a importarlo en las rutas, colocar app.use(express.json()) en index.js hará que funcione para todos los puntos finales/rutas.
Vea cómo va este refactor:
const router = require('express').Router() const User = require('./model/models') router.get('/', async (req, res) => { const data = await User.find({}) res.json(data) }) router.post('/', async (req, res) => { console.log('1') console.log(req.body) console.log('2') await User(req.body).save() res.json({ 'msg': 'ok' }) }) module.exports = routeríndice.js
const express = require('express') const app = express() var path = require('path') app.use(express.urlencoded(true)) app.use(express.json()) app.use('/', require('./routes/routes')) app.use(express.static(__dirname + '/public')) app.use('/api', require('./data/api')) app.listen(5000, function () { console.log('server is alive') })