#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"
}