Tiba-tiba ini terjadi pada semua proyek saya.
Setiap kali saya membuat posting di nodejs menggunakan express dan body-parser req.body
adalah objek kosong.
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())
// parse application/json
app.use(bodyParser.json())
app.listen(2000);
app.post("/", function (req, res) {
console.log(req.body) // populated!
res.send(200, req.body);
});
Melalui ajax dan tukang pos itu selalu kosong.
Namun via ikal
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
itu berfungsi sebagaimana dimaksud.
Saya mencoba pengaturan secara manual Content-type : application/json
di yang pertama tetapi kemudian saya selalu mendapatkannya400 bad request
Ini membuatku gila.
Saya pikir itu sesuatu yang diperbarui di body-parser tapi saya menurunkannya dan itu tidak membantu.
Bantuan apa pun dihargai, terima kasih.
Content-Type
tukang pos? Jika tidak, Anda dapat mencobanya, karena saya pernah mengalami masalah dengan tukang pos yang tidak mengirimContent-Type
.Jawaban:
Dalam tukang pos dari 3 opsi yang tersedia untuk jenis konten pilih "X-www-form-urlencoded" dan itu akan berfungsi.
Juga untuk menyingkirkan pesan kesalahan ganti:
Dengan:
Lihat https://github.com/expressjs/body-parser
Middleware 'body-parser' hanya menangani JSON dan data urlencoded, bukan multipart
sumber
app.use(express.json());
Dengan tukang pos, untuk menguji tindakan posting HTTP dengan muatan data JSON mentah, pilih
raw
opsi dan atur parameter header berikut:Juga, pastikan untuk membungkus string apa pun yang digunakan sebagai kunci / nilai dalam muatan JSON Anda dalam tanda kutip ganda.
The
body-parser
paket akan mengurai multisaluran muatan JSON baku baik-baik saja.Diuji di Chrome v37 dan v41 dengan ekstensi Postman v0.8.4.13 (
body-parser
v1.12.2 danexpress
v4.12.3) dengan penyiapan di bawah ini:sumber
form-data
di tukang pos untuk mengirim data, saya selalu mendapatkan{}
di req.body. Haruskah saya mengaturContent-Type
opsi?Saya membuat kesalahan yang sangat bodoh dan lupa mendefinisikan
name
atribut untuk input dalam file html saya.Jadi, bukannya
Aku punya ini.
Sekarang
request.body
diisi seperti ini:{ password: 'hhiiii' }
sumber
Saya menemukan, bahwa itu berfungsi ketika mengirim dengan tipe konten
dalam kombinasi dengan sisi server
app.use(bodyParser.json());
Sekarang saya dapat mengirim via
dan hasilnya tersedia di
request.body.name
server.sumber
xmlHttp.send(JSON.stringify(data));
Saya mengalami masalah ini hari ini, dan apa yang diperbaiki adalah menghapus header tipe konten di Postman! Sangat aneh. Menambahkannya di sini kalau-kalau itu membantu seseorang.
Saya mengikuti tutorial BeerLocker di sini: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
sumber
Anda harus memeriksa apakah middleware body-parser diatur dengan benar untuk jenis permintaan (json, urlencoded).
Jika sudah diatur,
maka pada tukang pos Anda harus mengirim data sebagai mentah.
https://i.stack.imgur.com/k9IdQ.png tangkapan layar tukang pos
Jika sudah diatur,
maka opsi 'x-www-form-urlencoded' harus dipilih.
sumber
Masalah saya adalah saya membuat rute terlebih dahulu
dan mendaftarkan middleware setelah rute
karena struktur aplikasi & salin dan tempel proyek bersama-sama dari contoh.
Setelah saya memperbaiki pesanan untuk mendaftar middleware sebelum rute, semuanya berhasil.
sumber
Bahkan ketika saya sedang belajar node.js untuk pertama kalinya di mana saya mulai mempelajarinya melalui web-app, saya telah melakukan semua hal ini dengan baik dalam formulir saya, masih saya tidak dapat menerima nilai dalam permintaan posting. Setelah lama debugging, saya mengetahui bahwa dalam bentuk yang saya berikan
enctype="multipart/form-data"
karena saya tidak bisa mendapatkan nilai. Saya hanya menghapusnya dan itu berhasil untuk saya.sumber
enctype="multipart/form-data"
multer
- lihat dokumentasi di npmjs.com/package/multerTampaknya jika Anda tidak menggunakan encType apa pun (standarnya adalah
application/x-www-form-urlencoded
) maka Anda mendapatkan bidang input teks tetapi Anda tidak akan mendapatkan file.Jika Anda memiliki formulir di mana Anda ingin memposting input teks dan file kemudian gunakan
multipart/form-data
jenis penyandian dan selain itu menggunakanmulter
middleware. Multer akan menguraikan objek permintaan dan mempersiapkanreq.file
untuk Anda dan semua bidang input lainnya akan tersedia melaluireq.body
.sumber
multer
memang solusi untuk masalah saya. Akan lebih baik jika Anda dapat menambahkan contoh tentang bagaimana menggunakan ini sebagai bagian dari jawaban AndaMasalah serupa terjadi pada saya, saya hanya mencampur urutan parade callback. Pastikan Anda mengatur fungsi panggilan balik dalam urutan yang benar. Setidaknya bagi siapa pun yang memiliki masalah yang sama.
sumber
Pastikan ["kunci": "ketik", "nilai": "json"] & ["kunci": "Jenis-Konten", "nilai": "application / x-www-form-urlencoded"] ada di Anda tajuk permintaan tukang pos
sumber
Saya memecahkan ini menggunakan
multer
seperti yang disarankan di atas, tetapi mereka tidak memberikan contoh yang berfungsi penuh, tentang bagaimana melakukan ini. Pada dasarnya ini bisa terjadi ketika Anda memiliki grup formulirenctype="multipart/form-data"
. Ini HTML untuk formulir yang saya punya:Dan inilah cara menggunakannya
multer
untuk mendapatkan nilai dan nama formulir ini denganExpress.js
dannode.js
:sumber
Saya memiliki masalah yang sama beberapa menit yang lalu, saya mencoba segala kemungkinan dalam jawaban di atas tetapi ada yang berhasil.
Satu-satunya hal yang saya lakukan, adalah meng-upgrade versi Node JS, saya tidak tahu bahwa peningkatan dapat memengaruhi sesuatu, tetapi itu benar.
Saya telah menginstal versi Node JS
10.15.0
( versi terbaru), saya kembali ke8.11.3
dan semuanya sekarang berfungsi. Mungkinbody-parser
modul harus memperbaikinya.sumber
Saya tidak memiliki nama di Input saya ... permintaan saya kosong ... senang itu sudah selesai dan saya bisa terus coding. Terimakasih semuanya!
Jawaban yang saya gunakan oleh Jason Kim:
Jadi, bukannya
aku punya ini
sumber
Anda tidak boleh melakukannya
JSON.stringify(data)
saat mengirim melalui AJAX seperti di bawah ini.Ini BUKAN kode yang benar:
Kode yang benar adalah:
sumber
Jika Anda melakukannya dengan tukang pos, Harap konfirmasikan hal-hal ini ketika Anda meminta API
sumber
Saya menggunakan restify bukannya express dan mengalami masalah yang sama. Solusinya adalah melakukan:
sumber
Saya yakin ini bisa menyelesaikannya
app.use(express.json());
sumber
Ubah
app.use(bodyParser.urlencoded());
kode Anda menjadidan di tukang pos, di header perubahan
Content-Type
nilai dariapplication/x-www-form-urlencoded
menjadiapplication/json
Ta :-)
sumber
Terima kasih atas jawaban Anda! Menghabiskan waktu mencari solusi, dan di sisi saya, saya membuat kesalahan mendasar: Saya menelepon
bodyParser.json()
dari dalam fungsi:Saya hanya perlu melakukan
app.use(['/password'], bodyParser.json())
dan itu berhasil ...sumber
Di tukang pos, bahkan setelah mengikuti jawaban yang diterima, saya mendapatkan tubuh permintaan kosong. Masalahnya ternyata tidak melewati tajuk yang disebut
Header ini hadir secara default (bersama 5 lainnya) yang telah saya nonaktifkan. Aktifkan ini dan Anda akan menerima badan permintaan.
sumber
Masalah saya adalah membuat rute terlebih dahulu
require("./routes/routes")(app);
saya menggesernya ke akhir kode sebelumapp.listen
dan berhasil!sumber