नोड या एक्सप्रेस का उपयोग करके JSON को वापस करने का उचित तरीका


440

तो, एक निम्नलिखित JSON ऑब्जेक्ट लाने का प्रयास कर सकता है:

$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=ISO-8859-1
Date: Wed, 30 Oct 2013 22:19:10 GMT
Server: Google Frontend
Cache-Control: private
Alternate-Protocol: 80:quic,80:quic
Transfer-Encoding: chunked

{
   "anotherKey": "anotherValue",
   "key": "value"
}
$

वहाँ नोड या एक्सप्रेस का उपयोग कर एक सर्वर से एक प्रतिक्रिया में वास्तव में एक ही शरीर का उत्पादन करने का एक तरीका है? स्पष्ट रूप से, कोई हेडर सेट कर सकता है और संकेत कर सकता है कि प्रतिक्रिया का सामग्री-प्रकार "एप्लिकेशन / जसन" होने जा रहा है, लेकिन फिर ऑब्जेक्ट को लिखने / भेजने के लिए अलग-अलग तरीके हैं। जो मैंने आमतौर पर इस्तेमाल किया जा रहा है वह प्रपत्र की एक कमांड का उपयोग करके है:

response.write(JSON.stringify(anObject));

हालांकि, इसके दो बिंदु हैं जहां कोई तर्क दे सकता है जैसे कि वे "समस्याएं" थे:

  • हम एक तार भेज रहे हैं।
  • इसके अलावा, अंत में कोई नई पंक्ति वर्ण नहीं है।

कमांड का उपयोग करने के लिए एक और विचार है:

response.send(anObject);

यह ऊपर दिए गए पहले उदाहरण के समान कर्ल के आउटपुट के आधार पर JSON ऑब्जेक्ट भेजना प्रतीत होता है। हालांकि, शरीर के अंत में कोई नया लाइन वर्ण नहीं है जब कर्ल को फिर से एक टर्मिनल पर उपयोग किया जा रहा है। तो, कोई वास्तव में नोड या नोड / एक्सप्रेस का उपयोग करके अंत में संलग्न एक नई पंक्ति चरित्र के साथ ऐसा कैसे लिख सकता है?

जवाबों:


620

यह प्रतिक्रिया एक स्ट्रिंग भी है, यदि आप प्रतिक्रिया को भेजना चाहते हैं, तो कुछ अजीब कारण से, आप कुछ का उपयोग कर सकते हैं JSON.stringify(anObject, null, 3)

यह महत्वपूर्ण है कि आप Content-Typeहैडर को application/jsonभी सेट करें ।

var http = require('http');

var app = http.createServer(function(req,res){
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({ a: 1 }));
});
app.listen(3000);

// > {"a":1}

prettified:

var http = require('http');

var app = http.createServer(function(req,res){
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);

// >  {
// >     "a": 1
// >  }

मुझे बिल्कुल यकीन नहीं है कि आप इसे एक नई रूपरेखा के साथ क्यों समाप्त करना चाहते हैं, लेकिन आप JSON.stringify(...) + '\n'इसे प्राप्त करने के लिए बस कर सकते हैं ।

एक्सप्रेस

व्यक्त में आप इसके बजाय विकल्प बदलकर ऐसा कर सकते हैं ।

'json replacer' JSON कॉलबैक को डिफ़ॉल्ट रूप से शून्य करता है

'json spaces' प्रारूपण के लिए JSON प्रतिक्रिया स्थान, विकास में 2 से चूक, उत्पादन में 0

वास्तव में 40 पर सेट करने के लिए अनुशंसित नहीं है

app.set('json spaces', 40);

तब आप बस कुछ जुबान से जवाब दे सकते थे।

res.json({ a: 1 });

यह 'json spaces'पूर्व-विन्यास का उपयोग करेगा।


3
आपके समय के लिए शुक्रिया। आपके साथ ईमानदार होने के लिए, मुझे अपने अंत पर कोई समस्या नहीं है। यह सिर्फ इतना है कि किसी ने (अलग-अलग समयक्षेत्र में) उस प्रारूप के बारे में शिकायत की जो मैं उपयोग कर रहा था क्योंकि वह एक काम करना चाहता था और किसी कारण से वे मेरी वस्तु को ठीक से नहीं पढ़ सके। स्ट्रिंग के अच्छे संस्करण पर ध्यान देने के लिए धन्यवाद। :)
माइटीहाउस

2
यह किसी को वास्तव में JSON स्ट्रिंग को ऑब्जेक्ट्स में पार्स करना चाहिए, या ब्राउज़र एक्सटेंशन का उपयोग करना चाहिए , बजाय किसी भी हाथ से पढ़ने की कोशिश करने के लिए।
bevacqua

2
@akshay इससे भी बेहतर, res.sendस्वचालित रूप content-typeसे JSON पर सेट होगा , अगर भेजा गया आइटम ऑब्जेक्ट या एरे है।
रोहिणी

3
मुझे लगता है कि आपको res.end()अपने http(गैर-एक्सप्रेस) उदाहरण में उपयोग करने का मतलब है
टोबियास फ्यूके

2
@ TobiasFünke सही है मुझे लगता है। res.send()काम नहीं कर रहा। कृपया इसे सुधारें, यदि यह कोई गलती है। res.end()सही ढंग से काम कर रहा है। धन्यवाद बी.टी.वी.
कौशल्या

410

Express.js 3x के बाद से प्रतिक्रिया ऑब्जेक्ट में एक json () विधि है जो सभी हेडर को आपके लिए सही ढंग से सेट करता है और JSON प्रारूप में प्रतिक्रिया देता है।

उदाहरण:

res.json({"foo": "bar"});

आपके समय के लिए शुक्रिया। हालांकि, मेरा सवाल वास्तव में हेडर के बारे में नहीं था। यह उस परिणाम के बारे में अधिक था जो कर्ल के माध्यम से कह सकता है। फिर भी धन्यवाद।
माइटीमाउस

53
ठीक है, लेकिन यह विधि JSON के रूप में भी ठीक से स्वरूपित है। यह प्रतिक्रिया का हिस्सा है। तो res.json () सही हेडर सेट करता है और फिर JSON.stringify () आपके लिए स्वचालित रूप से प्रतिक्रिया देता है।
जेमीएल

19

यदि आप एक json फ़ाइल भेजने की कोशिश कर रहे हैं तो आप धाराओं का उपयोग कर सकते हैं

var usersFilePath = path.join(__dirname, 'users.min.json');

apiRouter.get('/users', function(req, res){
    var readable = fs.createReadStream(usersFilePath);
    readable.pipe(res);
});

10
एफएस क्या है, पाइप क्या है, क्या पठनीय है? आपका जवाब एक रहस्य से अधिक है
आकाश दवे

11

res.json()समारोह ज्यादातर मामलों के लिए पर्याप्त होना चाहिए।

app.get('/', (req, res) => res.json({ answer: 42 }));

res.json()समारोह धर्मान्तरित पैरामीटर आप उपयोग कर JSON के पास JSON.stringify()और सेट Content-Typeशीर्ष लेख के लिए application/json; charset=utf-8HTTP ताकि ग्राहकों को स्वचालित रूप से प्रतिसाद पार्स करने में पता है।


6

यदि आप एक्सप्रेस का उपयोग कर रहे हैं तो आप इसका उपयोग कर सकते हैं:

res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({key:"value"}));

या बस यह

res.json({key:"value"});

5

आप बस पाइप और कई प्रोसेसर में से एक का उपयोग करके इसे पूर्व निर्धारित कर सकते हैं। आपके ऐप को हमेशा यथासंभव छोटे लोड के साथ प्रतिक्रिया करनी चाहिए।

$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print

https://github.com/ddopson/underscore-cli


4

आप इसके लिए एक सहायक बना सकते हैं: एक सहायक कार्य करें ताकि आप इसे अपने आवेदन में हर जगह उपयोग कर सकें

function getStandardResponse(status,message,data){
    return {
        status: status,
        message : message,
        data : data
     }
}

यहाँ मेरा विषय मार्ग है जहाँ मैं सभी विषयों को प्राप्त करने की कोशिश कर रहा हूँ

router.get('/', async (req, res) => {
    const topics = await Topic.find().sort('name');
    return res.json(getStandardResponse(true, "", topics));
});

प्रतिक्रिया हमें मिलती है

{
"status": true,
"message": "",
"data": [
    {
        "description": "sqswqswqs",
        "timestamp": "2019-11-29T12:46:21.633Z",
        "_id": "5de1131d8f7be5395080f7b9",
        "name": "topics test xqxq",
        "thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575031579309.jpg",
        "category_id": "5de0fe0b4f76c22ebce2b70a",
        "__v": 0
    },
    {
        "description": "sqswqswqs",
        "timestamp": "2019-11-29T12:50:35.627Z",
        "_id": "5de1141bc902041b58377218",
        "name": "topics test xqxq",
        "thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575031835605.jpg",
        "category_id": "5de0fe0b4f76c22ebce2b70a",
        "__v": 0
    },
    {
        "description": " ",
        "timestamp": "2019-11-30T06:51:18.936Z",
        "_id": "5de211665c3f2c26c00fe64f",
        "name": "topics test xqxq",
        "thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575096678917.jpg",
        "category_id": "5de0fe0b4f76c22ebce2b70a",
        "__v": 0
    },
    {
        "description": "null",
        "timestamp": "2019-11-30T06:51:41.060Z",
        "_id": "5de2117d5c3f2c26c00fe650",
        "name": "topics test xqxq",
        "thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575096701051.jpg",
        "category_id": "5de0fe0b4f76c22ebce2b70a",
        "__v": 0
    },
    {
        "description": "swqdwqd wwwwdwq",
        "timestamp": "2019-11-30T07:05:22.398Z",
        "_id": "5de214b2964be62d78358f87",
        "name": "topics test xqxq",
        "thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575097522372.jpg",
        "category_id": "5de0fe0b4f76c22ebce2b70a",
        "__v": 0
    },
    {
        "description": "swqdwqd wwwwdwq",
        "timestamp": "2019-11-30T07:36:48.894Z",
        "_id": "5de21c1006f2b81790276f6a",
        "name": "topics test xqxq",
        "thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575099408870.jpg",
        "category_id": "5de0fe0b4f76c22ebce2b70a",
        "__v": 0
    }
      ]
}

3

आप डिफ़ॉल्ट सामग्री-प्रकार सेट करने के लिए एक मिडलवेयर का उपयोग कर सकते हैं, और विशेष रूप से एपीआई के लिए सामग्री-प्रकार अलग सेट कर सकते हैं। यहाँ एक उदाहरण है:

const express = require('express');
const app = express();

const port = process.env.PORT || 3000;

const server = app.listen(port);

server.timeout = 1000 * 60 * 10; // 10 minutes

// Use middleware to set the default Content-Type
app.use(function (req, res, next) {
    res.header('Content-Type', 'application/json');
    next();
});

app.get('/api/endpoint1', (req, res) => {
    res.send(JSON.stringify({value: 1}));
})

app.get('/api/endpoint2', (req, res) => {
    // Set Content-Type differently for this particular API
    res.set({'Content-Type': 'application/xml'});
    res.send(`<note>
        <to>Tove</to>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
        </note>`);
})

2

शीर्ष लेख के आधे प्रश्न के लिए, मैं res.typeयहाँ पर एक चिल्लाहट देने जा रहा हूँ :

res.type('json')

के बराबर है

res.setHeader('Content-Type', 'application/json')

स्रोत: एक्सप्रेस डॉक्स :

निर्दिष्ट प्रकार के लिए mime.lookup () द्वारा निर्धारित MIME प्रकार के लिए सामग्री-प्रकार HTTP शीर्ष लेख सेट करता है। यदि प्रकार में "/" वर्ण है, तो यह सामग्री-प्रकार को टाइप करने के लिए सेट करता है।


1

एक्सप्रेस के पुराने संस्करण का उपयोग करें app.use(express.json())या bodyParser.json() bodyParser मिडलवेयर के बारे में अधिक पढ़ें

एक्सप्रेस के नवीनतम संस्करण पर हम बस उपयोग कर सकते हैं res.json()

const express = require('express'),
    port = process.env.port || 3000,
    app = express()

app.get('/', (req, res) => res.json({key: "value"}))

app.listen(port, () => console.log(`Server start at ${port}`))

मेरे प्रिय, आप अनुरोध के साथ प्रतिक्रिया को भ्रमित कर रहे हैं। BodyParser मिडलवेयर अनुरोध को पार्स करने के लिए है ताकि अनुरोध के req.bodyनिकाय के रूप में भेजी गई वस्तु हो।
मथायस ह्रीनिस्ज़क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.