নোড বা এক্সপ্রেস ব্যবহার করে জেএসএন ফেরতের উপযুক্ত উপায়


438

সুতরাং, কেউ নিম্নলিখিত 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 অবজেক্ট প্রেরণ করছে বলে মনে হচ্ছে। তবে কার্ল আবার টার্মিনালে ব্যবহার করা হচ্ছে যখন শরীরের শেষ প্রান্তে কোন নতুন রেখা অক্ষর নেই। সুতরাং, কেউ আসলে নোড বা নোড / এক্সপ্রেস ব্যবহার করে শেষের সাথে যুক্ত হওয়া একটি নতুন লাইনের চরিত্রের সাথে কীভাবে এমন কিছু লিখতে পারে?

উত্তর:


619

এই প্রতিক্রিয়াটিও একটি স্ট্রিং, যদি আপনি কিছু প্রতিকূল কারণে প্রতিক্রিয়াটিকে পূর্বনির্ধারিতভাবে প্রেরণ করতে চান তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন 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 spaces' ফর্ম্যাট করার জন্য জেএসওএন প্রতিক্রিয়া শূন্যস্থান, বিকাশে 2 এ ডিফল্ট, উত্পাদনে 0

40 এ সেট করার প্রস্তাব দেওয়া হয়নি

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

তারপরে আপনি কিছু জসন দিয়ে সাড়া দিতে পারেন।

res.json({ a: 1 });

এটি 'json spaces'কনফিগারেশনটি এটি প্রাকদৃষ্ট করার জন্য ব্যবহার করবে।


3
সময় দেয়ার জন্য ধন্যবাদ. আপনার সাথে সত্য কথা বলতে গেলে আমার শেষের দিকে কোনও সমস্যা নেই। এটি ঠিক যে কোনও ব্যক্তি (বিভিন্ন টাইমজোনটিতে) আমি যে ফর্ম্যাটটি ব্যবহার করছিলাম সে সম্পর্কে অভিযোগ করেছিলেন কারণ তিনি একটি পেতে চান এবং কোনও কারণে তারা আমার জিনিসটি সঠিকভাবে পড়তে পারেন নি। স্ট্রিংফাইয়ের দুর্দান্ত সংস্করণটি লক্ষ্য করার জন্য ধন্যবাদ। :)
মাইটিমাউস

2
এই কাউকে হাত দিয়ে কোনও পাঠ্য করার চেষ্টা করার পরিবর্তে বস্তুগুলিতে JSON স্ট্রিংটি সত্যই পার্স করা উচিত বা ব্রাউজার এক্সটেনশন ব্যবহার করা উচিত।
bevacqua

2
@ আকাশ এমনকি আরও ভাল, যদি প্রেরিত আইটেমটি কোনও বস্তু বা অ্যারে হয় তবে res.sendস্বয়ংক্রিয়ভাবে content-typeJSON এ সেট করবে will
রোয়াহোই

3
আমি মনে করি আপনি res.end()আপনার http(অ-এক্সপ্রেস) উদাহরণটি ব্যবহার করতে চেয়েছিলেন
টোবিয়াস ফান্কে

2
@ টোবিয়াস ফান্কে ঠিক বলেছেন আমার মনে হয়। res.send()কাজ করছে না. দয়া করে এটি সংশোধন করুন, যদি এটি ভুল হয়। res.end()সঠিকভাবে কাজ করছে। আপনাকে ধন্যবাদ বিটিডব্লিউ
কাউশাল 28

409

যেহেতু এক্সপ্রেস.জেএসএক্স 3x রেসপন্স অবজেক্টে একটি জেসন () পদ্ধতি রয়েছে যা আপনার জন্য সমস্ত শিরোনাম সঠিকভাবে সেট করে এবং জেএসএন ফর্ম্যাটে প্রতিক্রিয়া ফিরিয়ে দেয়।

উদাহরণ:

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

সময় দেয়ার জন্য ধন্যবাদ. তবে, আমার প্রশ্নটি তখনকার শিরোনাম সম্পর্কে ছিল না। এটি কার্লের মাধ্যমে বলতে পারে এমন ফলাফল সম্পর্কে আরও ছিল। যাইহোক আবার ধন্যবাদ।
মাইটিমাউস

53
ঠিক আছে, তবে এই পদ্ধতিটি JSON কেও যথাযথভাবে ফর্ম্যাট করে। এটি প্রতিক্রিয়া অংশ। সুতরাং res.json () সঠিক শিরোনাম সেট করে এবং তারপরে স্বয়ংক্রিয়ভাবে JSON.stringify () এর প্রতিক্রিয়া।
জেমিএল

19

আপনি যদি কোনও জসন ফাইল প্রেরণের চেষ্টা করছেন তবে আপনি স্ট্রিম ব্যবহার করতে পারেন

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')

উত্স: এক্সপ্রেস ডক্স :

নির্দিষ্ট ধরণের জন্য মাইম.লুকআপ () দ্বারা নির্ধারিত হিসাবে মাইম টাইপে সামগ্রী-প্রকারের HTTP শিরোনাম সেট করে। যদি টাইপটিতে "/" অক্ষর থাকে তবে তা বিষয়বস্তু প্রকারকে টাইপ করে সেট করে।


1

এক্সপ্রেসের পুরানো সংস্করণ বডি পার্সার মিডওয়্যার সম্পর্কে আরও পড়ুনapp.use(express.json()) বা bodyParser.json() পড়ুন

এক্সপ্রেসের সর্বশেষ সংস্করণে আমরা কেবল ব্যবহার করতে পারি 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}`))

আমার প্রিয়, আপনি অনুরোধ সহ বিভ্রান্তিকর প্রতিক্রিয়া। বডি পার্সার মিডলওয়্যারটি অনুরোধটি বিশ্লেষণের জন্য যাতে অনুরোধের অংশ req.bodyহিসাবে প্রেরণ করা বস্তুটি।
ম্যাথিয়াস হরিণিজাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.