Saya memiliki kode Node.js berikut:
var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());
app.post('/', function(request, response) {
response.write(request.body.user);
response.end();
});
Sekarang jika saya POST sesuatu seperti:
curl -d user=Someone -H Accept:application/json --url http://localhost:5000
Saya mendapatkan Someone
seperti yang diharapkan. Sekarang, bagaimana jika saya ingin mendapatkan badan permintaan penuh? Saya mencoba melakukan response.write(request.body)
tetapi Node.js melempar pengecualian yang mengatakan " argumen pertama harus berupa string atau Buffer " kemudian pergi ke "loop tak terbatas" dengan pengecualian yang mengatakan " Tidak dapat mengatur header setelah dikirim. "; ini juga berlaku bahkan jika saya melakukannya var reqBody = request.body;
dan kemudian menulis response.write(reqBody)
.
Apa masalahnya di sini?
Juga, bisakah saya mendapatkan permintaan mentah tanpa menggunakan express.bodyParser()
?
javascript
node.js
express
TheBlueSky
sumber
sumber
response.write(reqBody)
; ketika saya menggunakanresponse.send(reqBody)
hal-hal bekerja dengan baik ... dan ya, saya gunakanresponse.end
setelahresponse.write
.Jawaban:
Express 4.0 dan di atas:
$ npm install --save body-parser
Dan kemudian di aplikasi simpul Anda:
Express 3.0 dan di bawah ini:
Coba sampaikan ini dalam panggilan CURL Anda:
--header "Content-Type: application/json"
dan memastikan data Anda dalam format JSON:
{"user":"someone"}
Juga, Anda bisa menggunakan console.dir dalam kode node.js Anda untuk melihat data di dalam objek seperti dalam contoh berikut:
Pertanyaan lain ini mungkin juga membantu: Bagaimana cara menerima JSON dalam permintaan POST node.js express?
Jika Anda tidak ingin menggunakan bodyParser lihat pertanyaan lain ini: https://stackoverflow.com/a/9920700/446681
sumber
curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000
tetapi itu memberi saya kesalahan " Token tak terduga ", itulah sebabnya saya beralih ke panggilan yang disebutkan di pos asli saya.express.bodyParser()
tidak digunakan lagi dalam Express 4.x. Gunakan npmjs.org/package/body-parser sebagai gantinya.echo any"thing"
. Data yang Anda poskan harus dalam tanda kutip untuk mencegah hal ini terjadi.Mulai dari express v4.16 tidak perlu memerlukan modul tambahan, cukup gunakan middleware JSON bawaan :
Seperti ini:
Catatan -
body-parser
, di mana ini tergantung, sudah termasuk dengan express.Juga jangan lupa untuk mengirim tajuk
Content-Type: application/json
sumber
Pada Express 4, kode berikut ini muncul untuk melakukan trik. Perhatikan bahwa Anda harus menginstal
body-parser
menggunakannpm
.sumber
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true })
yang juga diperlukan? Saya memposting dokumen yang agak rumit sebagai JSON dalam permintaan, danextended: false
tidak berfungsi. Hanya ketika saya mengaturnya menjadi true, permintaan diurai dengan benar.app.use(bodyParser.urlencoded({ extended: true }));
DANapp.use(bodyParser.json())
untuk mendapatkan data json pada pengaturan server AWS Linux dengan NodeJS dan Express.Ini akan membantu Anda. Saya menganggap Anda mengirim tubuh di json.
sumber
Untuk 2019, Anda tidak perlu menginstal
body-parser
.Kamu bisa memakai:
sumber
Ini dapat dicapai tanpa
body-parser
ketergantungan juga, mendengarkanrequest:data
danrequest:end
dan mengembalikan respons pada akhir permintaan, lihat contoh kode di bawah ini. ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-bodysumber
Coba ini:
Itu akan mengambil objek yang
bodyParser
telah dibuat untuk Anda dan mengubahnya kembali menjadi string dan menulisnya ke respons. Jika Anda ingin badan permintaan yang tepat (dengan spasi yang sama, dll), Anda akan perludata
danend
pendengar melekat pada permintaan sebelumnya dan membangun potongan string dengan potongan seperti yang Anda lihat dalam kode sumber parsing json dari terhubung .sumber
Apa yang Anda klaim "coba lakukan" adalah persis apa yang Anda tulis dalam kode yang berfungsi "seperti yang diharapkan" saat Anda memintanya dengan ikal.
Kesalahan yang Anda dapatkan tampaknya tidak terkait dengan salah satu kode yang Anda tunjukkan kepada kami.
Jika Anda ingin mendapatkan permintaan mentah, aktifkan penangan
request
untukdata
danend
acara (dan, tentu saja, hapus semua permintaan dariexpress.bodyParser()
). Perhatikan bahwadata
peristiwa akan terjadi dalam potongan, dan bahwa kecuali jika Anda menetapkan penyandian untukdata
peristiwa potongan tersebut akan menjadi buffer, bukan string.sumber
request.body
dan tidakrequest.body.user
, dan saya memperbaikinya sekarang. By the way,var reqBody = request.body;
itu dan masih benar dan ketika Anda mencobanya Anda akan mendapatkan kesalahan yang saya dapatkan. Bagaimanapun, dapatkah Anda memberi contoh tentang pengaturan handler padarequest
; Saya sepertinya tidak menemukannya di panduan kilat.Jika Anda cukup malas untuk membaca potongan data posting. Anda bisa menempelkannya di bawah baris untuk membaca json.
Di bawah ini untuk TypeScript yang serupa dapat dilakukan untuk JS juga.
app.ts
Di salah satu pengontrol Anda yang menerima penggunaan panggilan POST seperti yang ditunjukkan di bawah ini
userController.ts
sumber
Saya benar-benar baru di JS dan ES, tetapi yang tampaknya berhasil bagi saya hanyalah ini:
Beri tahu saya jika ada yang salah dengan itu!
sumber
Instal Body Parser dengan perintah di bawah ini
Konfigurasikan Parser Tubuh
sumber
Anda menggunakan kode berikut untuk mencatat data posting:
sumber