Post запрос, сохраняющий только ключ версии с помощью Mongoose и Express

#node.js #mongodb #express #mongoose

#node.js #mongodb #экспресс #mongoose

Вопрос:

Я пытаюсь сохранить число и несколько строковых значений в MongoDB, и хотя код имеет для меня смысл, не возвращает ошибок и создает запись в базе данных, все, что я получаю, это просто ключ версии, что-то вроде этого:

 {
    "_id": {
        "$oid": "58052711f319bc041c5ebdac"
    },
    "__v": 0
}
  

Я подумал, что сначала попробую сохранить номер и заголовок, чтобы посмотреть, будут ли они сохранены, но они этого не делают, как вы можете видеть выше.
Каждый RESTful API и экспресс-руководство по запросу «post» и ответ, которые я нахожу, похоже, делают это по-разному!

Кроме того, предполагается ли, что он отображает res.json в виде открытого текста, чтобы я мог как-то форматировать или отображать, или он должен отображать значение свойства message: ?

Вот код

 // modules =======================================================
const express = require('express')
const app = express()
const mongoose = require('mongoose')


// configuration =================================================
const db = require('./config/db')


// mongoose ======================================================
mongoose.connect(db.url)

const PostSchema = new mongoose.Schema({
  number:Number,
  title:String,
  body:String,
  images:String
}, { collection: 'posts' })

const posts = mongoose.model('Post', PostSchema)


// routes ========================================================
app.post('/api/post', function(req, res) {
  var post = new posts()
  post.number = req.body.number
  post.title = req.body.title
  post.save(function(err) {
    if (err) res.send(err)
    res.json({ message: 'Post saved'})
  })
})
  

Вот моя форма HTML5

 <form action="/api/post" enctype="multipart/form-data" method="post">
  <label for="number">Post Number:</label>
  <input type="number" name="number" size="2" placeholder="required" required /><br />

  <label for="title">Title:</label>
  <input type="text" name="title" placeholder="optional" /><br />

  <label for="body">Text:</label><br />
  <textarea name="body" cols="80" rows="20" placeholder="optional"></textarea><br />

  <label for="images">Images:</label>
  <input type="text" name="images" placeholder="optional" />
  <span class="form-hint">Comma separated file names, e.g. image1.jpg,image2.jpg,image3.png</span><br />

  <input type="submit" value="Submit" />
</form>
  

Мое промежуточное программное обеспечение, которое поставляется непосредственно перед маршрутами в server.js

 // middleware ====================================================
app.use(bodyParser.json()) // parse application/json
app.use(bodyParser.json({ type: 'application/vnd.api json' })) // parse application/vnd.api json as json
app.use(bodyParser.urlencoded({ extended: true })) // parse application/x-www-form-urlencoded
app.use(methodOverride('X-HTTP-Method-Override')) // override with the X-HTTP-Method-Override header in the request
app.use(express.static(__dirname   '/public')) // set static files location
  

Комментарии:

1. Во-первых, для устранения проблемы вы вышли из системы req.body , чтобы убедиться, что вы получаете нужные свойства? Во-вторых, для res.json() вы получите обратно объект json, который выглядит как { message: "Post saved"} и все

2. Пустой объект {}, зарегистрированный из req.body, и каждое свойство, такое как req.body.number, регистрируется как неопределенное.

3. Я только что отредактировал свой вопрос, чтобы включить промежуточное программное обеспечение, которое я использую в server.js . Может быть, что-то там неправильно разбирается?

4. Таким образом, это говорит о том, что ваша форма неправильно отправляет данные. Вы можете просто выйти из системы req , чтобы посмотреть, сможете ли вы найти в нем данные, в противном случае вам придется посмотреть, что вы делаете для отправки данных (вызовы ajax или какая-либо другая форма публикации данных, что бы вы ни делали).

5. Я обнаружил, что это было enctype="multipart/form-data" в моей форме. Как только я удалил это, запрос получен и сохранен в базе данных должным образом. Спасибо! Эта часть смутила меня в примере. Я думаю, что я собрал несколько примеров, поскольку все они были разными, и первый, которому я следовал, не работал так, как описано.

Ответ №1:

Первый вопрос, кодировка должна соответствовать тому, что у вас есть для экспресс-анализа (в данном случае это было не multipart/form-data но application/json , 'application/vnd.api json' и application/x-www-form-urlencoded . Удаление типа кодировки, который вы указывали, исправляет это.

Во-вторых, ответом будет простой объект JSON:

 {
    "message": "Post saved"
}