简体   繁体   中英

mongoose Model.save() only returns { _id, __v }

I know this question has been asked before but I feel like I'm doing everything right and I'm still having an issue. I want to save an item from a form into my mongodb collection using mongoose.

My schema:

// stationmodel.js
export const StationSchema = new mongoose.Schema({
   "FDID": String,
   "Fire dept name": String,
   "HQ addr1": String,
   "HQ city": String,
   "HQ state": String,
   "HQ zip": Number,
   "HQ phone": String,
   "Dept Type": String,
   "Organization Type": String,
   "Website": String,
   "Number Of Stations": Number,
   "Primary agency for emergency mgmt": Boolean,
}, {collection: "FEMA_stations"}) 

In my express app:

// in routes.js
const StationSchema =  require('./stationmodel')
const Station = mongoose.model('Station', StationSchema, 'FEMA_stations')

const addstation = (req, res) => {
   console.log(req.body)
   const newStation = new Station(req.body)
   newStation.save( function(err){
      if (err) { console.error(err) }
      console.log('newStation after save', newStation)
   })
}

const routes = app => {
  app.route('/api/addstation')
    .post(addstation)
}

export default routes
// in index.js
import routes from './routes'

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

In my front end code, calling to the backend in a redux action:

fetch('/api/addstation', {
  method: "POST",
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(stationToAdd)
})

When I console.log(req.body) on my back end, I get the data I'm expecting. It looks something like this:

{
  FDID: '202020',
  'Fire dept name': 'Some Fire Department',
  'HQ addr1': 'Some address',
  'HQ city': 'San Dimas',
  'HQ state': 'CA',
  'HQ zip': 99999,
  'HQ phone': '5555555555',
  'Dept Type': 'Career',
  'Organization Type': 'State',
  Website: '',
  'Number Of Stations': 0,
  'Primary agency for emergency mgmt': true,
}

But when I console.log my newStation that I'm trying to .save() , all I get is a response like this:

{ _id: 5efe29911ea067248f3c39a0, __v: 0 }

I know other people had issues with their schema, their model, making sure that they're truly connected to their mongodb collection, or making sure that the request is made with the application/json header, but I feel I have all those things right. The code was pieced together from a much more modularized app to try to cut the fat and present the core issue, so let me know if I'm missing any glaring information.

What might be going wrong here? Why is the data from req.body not making it into my new document that I'm trying to save to the collection? Thanks for reading.

You are mixing es6 module import/export with Node.js CommonJS require .

In stationmodel.js You are using a "named export"

export const StationSchema = new mongoose.Schema(...

But in routes.js you are using CommonJS require

const StationSchema =  require('./stationmodel')

Which is likely to be an empty object. So the following line will create a model with an "empty" schema

const Station = mongoose.model('Station', StationSchema, 'FEMA_stations')

The solution

use named import instead

import { StationSchema } from './stationmodel'

TIP:

Since you are already name the file stationmodel.js , which suggests it's a model. You can put the following in stationmodel.js directly to prevent the model from getting incorrect schema

export const Station = mongoose.model('Station', StationSchema, 'FEMA_stations')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM