নোডেজ - http.request সহ প্রতিক্রিয়া লিখুন - লেখার সময় প্রথম যুক্তি অবশ্যই স্ট্রিং বা বাফার হতে হবে


95

আমি কেবল একটি নোড সার্ভার তৈরির চেষ্টা করছি যা প্রদত্ত URL এর HTTP স্থিতি ছাড়িয়ে যায়।

আমি যখন রেস রাইটের সাথে প্রতিক্রিয়াটি ফ্লাশ করার চেষ্টা করি তখন আমার ত্রুটিটি পাওয়া যায়: নতুন টাইপআরার নিক্ষেপ করুন ('প্রথম যুক্তিটি স্ট্রিং বা বাফার হতে হবে');

তবে আমি যদি এগুলিকে কনসোল.লগ দিয়ে প্রতিস্থাপন করি তবে সবকিছু ঠিক আছে (তবে কনসোল নয়, তবে তাদের ব্রাউজারে লিখতে হবে)।

কোডটি হ'ল

var server = http.createServer(function (req, res) {
    res.writeHead(200, {"Content-Type": "text/plain"});

    request({
        uri: 'http://www.google.com',
        method: 'GET',
        maxRedirects:3
    }, function(error, response, body) {
        if (!error) {
            res.write(response.statusCode);
        } else {
            //response.end(error);
            res.write(error);
        }
    });     

    res.end();
});
server.listen(9999);

আমি বিশ্বাস করি আমার কোথাও একটি কলব্যাক যোগ করা উচিত তবে বেশ বিভ্রান্ত এবং কোনও সাহায্যের প্রশংসা করা হয়েছে।

উত্তর:


32

অনুরোধটি একটি কলব্যাক পদ্ধতি গ্রহণ করে, এর অ্যাসিঙ্ক! সুতরাং আমি ধরে নিচ্ছি, কলব্যাক কার্যকর হওয়ার পরে কলটি পাওয়া যাবে res.end()। কলব্যাকের মধ্যে অনুরোধটি বন্ধ করার চেষ্টা করুন।


4
এটি করেছেন এবং এটিও যোগ করেছেন। স্ট্রিং। অনেক ধন্যবাদ.
umutm

মনে হচ্ছে আমি ভুলে গেছি। শুধু এটা কর. ধন্যবাদ.
umutm

4
@ ইমুটম আরও ভাল লিখিত এবং বিস্তৃত উত্তর রয়েছে, আপনার সম্ভবত তাদের একটি গ্রহণ করা উচিত; এই প্রশ্নে যে কারও কাছে তা দৃশ্যমান করা।
গৌরব আগরওয়াল

52

response.statusCodeএকটি সংখ্যা, যেমন response.statusCode === 200, না '200'। ত্রুটির বার্তাটি যেমন বলে, writeকোনও stringবা Bufferবস্তুর প্রত্যাশা করে , সুতরাং আপনাকে অবশ্যই এটি রূপান্তর করতে হবে।

res.write(response.statusCode.toString());

আপনি যদিও আপনার কলব্যাক মন্তব্য সম্পর্কে সঠিক। res.end();আপনার writeকলগুলির ঠিক নীচে কলব্যাকের অভ্যন্তরে থাকা উচিত ।


হ্যাঁ, এটি কৌশলটি করেছে। নোডেজ নবাগত হিসাবে, এটি জানতেন না এবং এত ধন্যবাদ।
umutm

48

আমি এই ত্রুটি বার্তাটি পেয়েছি এবং এতে বিকল্পগুলি উল্লেখ করা হয়েছে body

আমি এই প্রথম ছিল

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: {
        email: req.user.email
    }
});

আমি এটিকে এটিতে পরিবর্তন করেছি:

request.post({
    url: apiServerBaseUrl + '/v1/verify',
    body: JSON.stringify({
        email: req.user.email
    })
});

এবং এটি ত্রুটি বার্তা ছাড়াই এখন কাজ করছে বলে মনে হচ্ছে ... যদিও বাগের মতো।

আমি মনে করি এটি এটি করার আরও সরকারী উপায়:

 request.post({
        url: apiServerBaseUrl + '/v1/verify',
        json: true,
        body: {
            email: req.user.email
        }
    });

4
আপনার সমস্যাটি আলাদা, বডিটি পূর্বনির্ধারিতভাবে স্ট্রিং বা বাফার হিসাবে প্রত্যাশিত। আপনি এটি পরিবর্তন করতে পারেন (জসন সিরিয়ালাইজযোগ্য হতে) জেএসন যুক্ত করে: বিকল্পগুলির কাছে সত্য। উদাহরণস্বরূপ: অনুরোধ.পোস্ট ({url: apiServerBaseUrl + '/ v1 / যাচাই করুন', বডি: {ইমেল: req.user.email}, জসন: সত্য})
নুনো টমাস

4
স্ট্রিংফাই এড়াতে আপনি এটি ব্যবহার করতে পারেনjavascript request.post({ url: apiServerBaseUrl + '/v1/verify', json: { email: req.user.email } }
বিসোরেন্টিনো

13

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

var obj = { test : "test" };
console.log( obj ); // works
res.write( obj ); // fails

যে কোনও কিছুকে স্ট্রিংয়ে রূপান্তর করার একটি উপায় হ'ল:

res.write( "" + obj );

যখনই আপনি কিছু প্রেরণ করার চেষ্টা করছেন অন্য উপায়টি হল কল .toString()পদ্ধতি:

res.write( obj.toString( ) );

মনে রাখবেন যে আপনি যা খুঁজছেন তা এটি এখনও নাও হতে পারে। আপনার সর্বদা এ .writeজাতীয় কৌশল ছাড়া স্ট্রিং / বাফারগুলি দেওয়া উচিত ।

পার্শ্ব নোট হিসাবে: আমি ধরে নিই যে requestএটি একটি অ্যাসিনক্রোনাস অপারেশন। যদি এটি হয়, তবে res.end();কোনও লেখার আগে ডাকা হবে, অর্থাত কোনও লেখা যে কোনওভাবেই ব্যর্থ হবে (কারণ সংযোগটি সেই সময়ে বন্ধ হয়ে যাবে)। হ্যান্ডলারের মধ্যে সেই লাইনটি সরান:

request({
    uri: 'http://www.google.com',
    method: 'GET',
    maxRedirects:3
}, function(error, response, body) {
    if (!error) {
        res.write(response.statusCode);
    } else {
        //response.end(error);
        res.write(error);
    }
    res.end( );
});

উত্তর এবং বিস্তারিত তথ্যের জন্য অনেক ধন্যবাদ। এবং হ্যাঁ, আমি হ্যান্ডলারের মধ্যে রেস-এন্ড সরিয়ে নিয়েছি। আমি আগের মতো @ লগনফস্মিথকে গ্রহণ করেছি। আবার Thx।
umutm

1

আপনি যদি প্রতিক্রিয়াতে একটি JSON অবজেক্ট লিখতে চান তবে শিরোনামের বিষয়বস্তুর প্রকারটি অ্যাপ্লিকেশন / json এ পরিবর্তন করুন

response.writeHead(200, {"Content-Type": "application/json"});
var d = new Date(parseURL.query.iso);
var postData = {
    "hour" : d.getHours(),
    "minute" : d.getMinutes(),
    "second" : d.getSeconds()
}
response.write(postData)
response.end();

1

আর অন্য সম্ভাবনা (এই ক্ষেত্রে নয়) যখন, Ajax (XMLHttpRequest) সঙ্গে কাজ ক্লায়েন্ট শেষ আপনি ব্যবহার করা উচিত তথ্য ফেরত পাঠানোর সময় res.send (responsetext) res.end পরিবর্তে (responsetext)


1

যদিও সমস্যার সমাধান হয়েছে ত্রুটির সঠিক অর্থ ব্যাখ্যা করার জন্য জ্ঞান ভাগ করে নেওয়া।

ত্রুটিটি বলে যে সম্পর্কিত ব্রেকিং ফাংশনটির জন্য প্রয়োজনীয় প্যারামিটারগুলি প্রয়োজনীয় ফর্ম্যাটে নয় স্ট্রিং বা বাফারে নেই

সমাধানটি হল প্যারামিটারটিকে স্ট্রিংয়ে পরিবর্তন করা

breakingFunction(JSON.stringify(offendingParameter), ... other params...);

বা বাফার

breakingFunction(BSON.serialize(offendingParameter), ... other params...);

0

প্রথম যুক্তিটি অবশ্যই টাইপ স্ট্রিং বা বাফারগুলির একটি হতে হবে। প্রকারের বস্তুটি পেল

 at write_

আমি অনুরোধ মডিউলে বডি ডেটা দেওয়ার সময় আমি উপরের ত্রুটির মতো হয়ে উঠছিলাম।

আমি আর একটি প্যারামিটার পাস করেছি যা জেএসওএন: সত্য এবং এটির কার্যকরী।

var option={
url:"https://myfirstwebsite/v1/appdata",
json:true,
body:{name:'xyz',age:30},
headers://my credential
}
rp(option)
.then((res)=>{
res.send({response:res});})
.catch((error)=>{
res.send({response:error});})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.