Merespons dengan objek JSON di Node.js (mengonversi objek / larik menjadi string JSON)

98

Saya seorang newb untuk kode back-end dan saya mencoba untuk membuat fungsi yang akan menanggapi saya string JSON. Saat ini saya memiliki ini dari sebuah contoh

function random(response) {
  console.log("Request handler 'random was called.");
  response.writeHead(200, {"Content-Type": "text/html"});

  response.write("random numbers that should come in the form of json");
  response.end();
}

Ini pada dasarnya hanya mencetak string "nomor acak yang seharusnya datang dalam bentuk JSON". Apa yang saya ingin ini lakukan adalah menanggapi dengan string JSON dari angka apa pun. Apakah saya perlu menempatkan tipe konten yang berbeda? haruskah fungsi ini meneruskan nilai itu ke kata lain di sisi klien?

Terima kasih atas bantuan Anda!

pendaki
sumber
res.json ({"Key": "Value"});
Amol M Kulkarni

Jawaban:

161

Menggunakan res.json dengan Express:

function random(response) {
  console.log("response.json sets the appropriate header and performs JSON.stringify");
  response.json({ 
    anObject: { item1: "item1val", item2: "item2val" }, 
    anArray: ["item1", "item2"], 
    another: "item"
  });
}

Kalau tidak:

function random(response) {
  console.log("Request handler random was called.");
  response.writeHead(200, {"Content-Type": "application/json"});
  var otherArray = ["item1", "item2"];
  var otherObject = { item1: "item1val", item2: "item2val" };
  var json = JSON.stringify({ 
    anObject: otherObject, 
    anArray: otherArray, 
    another: "item"
  });
  response.end(json);
}
Kevin Reilly
sumber
76
var objToJson = { };
objToJson.response = response;
response.write(JSON.stringify(objToJson));

Jika alert(JSON.stringify(objToJson))Anda akan mendapatkan{"response":"value"}

druveen
sumber
Berhati-hatilah karena res.write (JSON.stringify ()) masih menunggu Anda untuk "mengakhiri" respons. (res.end ()); express .json () untuk ini untuk Anda
131
22

Anda harus menggunakan JSON.stringify()fungsi yang disertakan dengan mesin V8 yang digunakan node.

var objToJson = { ... };
response.write(JSON.stringify(objToJson));

Sunting: Sejauh yang saya tahu, IANA telah secara resmi mendaftarkan tipe MIME untuk JSON seperti application/jsondi RFC4627 . Itu juga terdaftar dalam daftar Jenis Media Internet di sini .

tyronegcarter
sumber
Haruskah header tipe konten juga disetel ke application / json atau semacamnya? Apa praktik terbaik untuk ini?
ampersand
1
Ya, untuk membuatnya menjadi respons yang valid, klien akan mengerti. Tambahkan: res.writeHead (200, {'Content-Type': 'application / json'}) sebelum
Ali
12

Per JamieL 's jawaban ke pos lain :

Sejak Express.js 3x objek respons memiliki metode json () yang menyetel semua header dengan benar untuk Anda.

Contoh:

res.json({"foo": "bar"});
Greg
sumber
Bagaimana saya bisa melakukan hal yang sama dengan file JSON?
HGB
jangan lupa res.end () jika Anda menggunakan ini, saya membutuhkannya
Charles Harring
2

secara ekspres mungkin ada pemformat JSON dengan cakupan aplikasi.

setelah melihat express \ lib \ response.js, saya menggunakan rutinitas ini:

function writeJsonPToRes(app, req, res, obj) {
    var replacer = app.get('json replacer');
    var spaces = app.get('json spaces');
    res.set('Content-Type', 'application/json');
    var partOfResponse = JSON.stringify(obj, replacer, spaces)
        .replace(/\u2028/g, '\\u2028')
        .replace(/\u2029/g, '\\u2029');
    var callback = req.query[app.get('jsonp callback name')];
    if (callback) {
        if (Array.isArray(callback)) callback = callback[0];
        res.set('Content-Type', 'text/javascript');
        var cb = callback.replace(/[^\[\]\w$.]/g, '');
        partOfResponse = 'typeof ' + cb + ' === \'function\' && ' + cb + '(' + partOfResponse + ');\n';
    }
    res.write(partOfResponse);
}
Amir Arad
sumber
Apakah ini untuk mengirim kembali fungsi javascript? Apakah ini benar? Dan mengapa Anda melakukan itu? Hanya ingin tahu
Sam Vloeberghs
0
const http = require('http');
const url = require('url');

http.createServer((req,res)=>{

    const parseObj =  url.parse(req.url,true);
    const users = [{id:1,name:'soura'},{id:2,name:'soumya'}]

    if(parseObj.pathname == '/user-details' && req.method == "GET") {
        let Id = parseObj.query.id;
        let user_details = {};
        users.forEach((data,index)=>{
            if(data.id == Id){
                user_details = data;
            }
        })
        res.writeHead(200,{'x-auth-token':'Auth Token'})
        res.write(JSON.stringify(user_details)) // Json to String Convert
        res.end();
    }
}).listen(8000);

Saya telah menggunakan kode di atas dalam proyek saya yang sudah ada.

Dev216
sumber