নোড.জেজে স্ট্রিং থেকে স্ট্রিমগুলি কীভাবে তৈরি করবেন?


177

আমি ya-csv একটি লাইব্রেরি ব্যবহার করছি যা কোনও ফাইল বা একটি স্ট্রিমকে ইনপুট হিসাবে প্রত্যাশা করে তবে আমার একটি স্ট্রিং রয়েছে।

আমি কীভাবে সেই স্ট্রিংটিকে নোডের প্রবাহে রূপান্তর করব?

উত্তর:


27

নোড 10.17 থেকে, স্ট্রিম.ড্রিডেবলের fromকাছে সহজেই কোনও পুনরাবৃত্তিযোগ্য (যা অ্যারে আক্ষরিক অন্তর্ভুক্ত) থেকে স্ট্রিম তৈরি করার একটি পদ্ধতি রয়েছে:

const { Readable } = require("stream")

const readable = Readable.from(["input string"])

readable.on("data", (chunk) => {
  console.log(chunk) // will be called once with `"input string"`
})

নোট করুন যে কমপক্ষে 10.17 থেকে 12.3 এর মধ্যে একটি স্ট্রিং নিজেই একটি পুনরাবৃত্তিযোগ্য, সুতরাং Readable.from("input string")এটি কাজ করবে, তবে প্রতিটি চরিত্রের জন্য একটি ইভেন্ট নির্গত করবে। Readable.from(["input string"])অ্যারেতে আইটেম প্রতি একটি ইভেন্ট নির্গত করবে (এই ক্ষেত্রে, একটি আইটেম)।

এছাড়াও নোট করুন যে পরবর্তী নোডগুলিতে (সম্ভবত 12.3, যেহেতু ডকুমেন্টেশন বলে যে ফাংশনটি তখন পরিবর্তিত হয়েছিল), আর অ্যারেতে স্ট্রিংটি মোড়ানো প্রয়োজন হয় না।

https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options



আমার খারাপ। ফাংশনটি 10.7-এ যুক্ত হয়েছিল এবং আমি মূলত বর্ণিতভাবে আচরণ করেছি। কিছুক্ষণের পরে, স্ট্রিংগুলিকে আরেগুলিতে আবৃত করা প্রয়োজন হয় না (12.3 থেকে এটি প্রতিটি অক্ষরকে স্বতন্ত্রভাবে পুনরাবৃত্তি করে না)।
ফিজকার

186

হিসাবে @substack আমার মধ্যে সংশোধিত #node , নতুন স্ট্রিম এপিআই নোড V10 এই সহজ করে তোলে:

const Readable = require('stream').Readable;
const s = new Readable();
s._read = () => {}; // redundant? see update below
s.push('your text here');
s.push(null);

… যার পরে আপনি এটিকে নিখরচায় পাইপ করতে পারেন বা অন্যথায় এটি আপনার উদ্দেশ্যপ্রাপ্ত গ্রাহকের কাছে দিতে পারেন।

এটি রেজিউমার ওয়ান-লাইনারের মতো পরিষ্কার নয় , তবে এটি অতিরিক্ত নির্ভরতা এড়িয়ে যায়।

( আপডেট: v0.10.26 এ v9.2.1 এর মধ্যে এখনও অবধি, আরইপিএল pushপ্রম্পট থেকে সরাসরি কল not implementedযদি আপনি সেট না করেন তবে ব্যতিক্রম সহ ক্রাশ _readহবে It এটি কোনও ফাংশন বা স্ক্রিপ্টের ভিতরে ক্রাশ হবে না If যদি অসঙ্গতি আপনাকে তোলে If নার্ভাস, অন্তর্ভুক্ত noop।)


6
থেকে ডক্স (লিঙ্ক) : "সকল রিডেবল প্রবাহ বাস্তবায়নের একটি প্রদান করতে হবে _readঅন্তর্নিহিত সম্পদ থেকে ডেটা আনতে পদ্ধতি।"
ফেলিক্স রাবে

2
@eye_mew আপনার প্রথমে ('স্ট্রিম') প্রয়োজন
জিম জোনস

8
আপনি কেন nullস্ট্রিমের বাফারে প্রবেশ করছেন?
দোপাট্রামন

5
@ দোপাট্রামন স্ট্রিমকে nullবলেছেন যে এটি সমস্ত ডেটা পড়া শেষ করে এবং স্ট্রিমটি বন্ধ করে দিয়েছে
ক্রিশ্চ্যানস্ট্যান্ড

2
দেখে মনে হচ্ছে আপনার এভাবে করা উচিত নয়। দস্তাবেজগুলির উদ্ধৃতি : " readable.push()পদ্ধতিটি কেবল পঠনযোগ্য ইমপ্লিমেন্টার দ্বারা ডাকা হয় এবং কেবলমাত্র readable._read()পদ্ধতির মধ্যে থেকে ।"
এক্সেল রাউশমায়ার

127

জো লিস এর পুনঃসূত্র উত্তরটি ব্যবহার করবেন না। এটি বেশিরভাগ ক্ষেত্রে কাজ করবে, তবে আমার ক্ষেত্রে এটি আমাকে ভাল 4 বা 5 ঘন্টা বাগের সন্ধান হারিয়েছে। এটি করার জন্য তৃতীয় পক্ষের মডিউলগুলির প্রয়োজন নেই।

নতুন উত্তর :

var Readable = require('stream').Readable

var s = new Readable()
s.push('beep')    // the string you want
s.push(null)      // indicates end-of-file basically - the end of the stream

এটি সম্পূর্ণরূপে কমপ্লায়েন্ট পঠনযোগ্য স্ট্রিম হওয়া উচিত। স্ট্রিমগুলি কীভাবে সঠিকভাবে ব্যবহার করতে হয় সে সম্পর্কে আরও তথ্যের জন্য এখানে দেখুন

পুরানো উত্তর : কেবল নেটিভ পাসথ্রু স্ট্রিমটি ব্যবহার করুন:

var stream = require("stream")
var a = new stream.PassThrough()
a.write("your string")
a.end()

a.pipe(process.stdout) // piping will work as normal
/*stream.on('data', function(x) {
   // using the 'data' event works too
   console.log('data '+x)
})*/
/*setTimeout(function() {
   // you can even pipe after the scheduler has had time to do other things
   a.pipe(process.stdout) 
},100)*/

a.on('end', function() {
    console.log('ended') // the end event will be called properly
})

নোট করুন যে 'ক্লোজ' ইভেন্টটি নির্গত হয় না (যা স্ট্রিম ইন্টারফেসগুলির দ্বারা প্রয়োজন হয় না)।


2
@ফিন আপনার জাভাস্ক্রিপ্টে পেরেনগুলির দরকার নেই যদি কোনও আর্ক না থাকে
বিটি

2018 এ "ভার" ব্যবহার করবেন না! তবে
কনস্ট

30

streamমডিউলটির কেবল একটি নতুন উদাহরণ তৈরি করুন এবং এটি আপনার প্রয়োজন অনুসারে কাস্টমাইজ করুন:

var Stream = require('stream');
var stream = new Stream();

stream.pipe = function(dest) {
  dest.write('your string');
  return dest;
};

stream.pipe(process.stdout); // in this case the terminal, change to ya-csv

অথবা

var Stream = require('stream');
var stream = new Stream();

stream.on('data', function(data) {
  process.stdout.write(data); // change process.stdout to ya-csv
});

stream.emit('data', 'this is my string');

13
এই কোডটি স্ট্রিমের কনভেনশনগুলি ভঙ্গ করে। pipe()গন্তব্য প্রবাহটি খুব কমপক্ষে ফিরে আসার কথা।
গ্রিম

2
আপনি যদি এই কোডটি ব্যবহার করেন তবে শেষ ইভেন্টটি বলা হবে না। এটি সাধারণত স্ট্রিম তৈরির জন্য ভাল উপায় নয় generally
বিটি

12

সম্পাদনা: গারথের উত্তর সম্ভবত আরও ভাল।

আমার পুরানো উত্তর পাঠ্য নীচে সংরক্ষিত আছে।


স্ট্রিমকে স্ট্রিমে রূপান্তর করতে, আপনি স্ট্রিমের মাধ্যমে বিরতি ব্যবহার করতে পারেন :

through().pause().queue('your string').end()

উদাহরণ:

var through = require('through')

// Create a paused stream and buffer some data into it:
var stream = through().pause().queue('your string').end()

// Pass stream around:
callback(null, stream)

// Now that a consumer has attached, remember to resume the stream:
stream.resume()

আমার ব্যবহারের ক্ষেত্রে কাজ করার জন্য আমি জিমেরিকোর সমাধান পেতে পারি না, তবে resumerবেশ ভালভাবে কাজ করেছি। ধন্যবাদ!
এমপেইন

@ সাবস্ট্যাক পুনরায় সরবরাহকারী পরামর্শটি আমার পক্ষে খুব ভাল কাজ করেছে। ধন্যবাদ!
গার্থ কিড

2
রিসুমার দুর্দান্ত, তবে আপনি যদি অজানা গ্রাহকদের কাছে এই স্ট্রিমটি প্রেরণ করতে পারেন এমন প্রত্যাশা করেন তবে "নেক্সটটিকের স্ট্রিমটি স্বয়ংক্রিয়ভাবে পুনঃসূচনা করে" চমক পেতে পারে! আমার কিছু কোড রয়েছে যা কোনও ফাইলে একটি সামগ্রীর স্ট্রিমটি পাইপ করে যদি মেটাডেটার একটি ডিবি সেভ সফল হয়। এটি একটি লুক্কায়িত বাগ ছিল, যখন ডিবি রাই সঙ্গে সঙ্গে সাফল্য ফিরিয়ে দেয় তখন এটি সফল হয়েছিল! আমি পরে জিনিসগুলিকে অ্যাসিঙ্ক ব্লকের ভিতরে রাখার জন্য রিফ্যাক্টর করেছিলাম এবং বুম, স্ট্রিমটি কখনও পঠনযোগ্য ছিল না। পাঠ: আপনার প্রবাহটি কে গ্রাস করবে তা যদি আপনি না জানেন, তবে () বিরতি দিন () বিরতি দিন ('স্ট্রিং')। শেষ () কৌশলটি আটকে দিন।
জলি রজার

1
আমি আমার কোডটি ডিবাগ করতে প্রায় 5 ঘন্টা ব্যয় করেছি কারণ আমি এই উত্তরের পুনঃসূত্র অংশটি ব্যবহার করেছি। আপনি যদি পছন্দ করতে পারেন তবে দুর্দান্ত লাগবে .. এটি সরিয়ে দিন
বিটি

10

এর জন্য একটি মডিউল রয়েছে: https://www.npmjs.com/package/string-to-stream

var str = require('string-to-stream')
str('hi there').pipe(process.stdout) // => 'hi there' 

1
"এটির জন্য একটি অ্যাপ্লিকেশন রয়েছে" কি এটি একটি পাণ? ;)
মাস্টারেক্সিলো

1
মন্তব্যে লিঙ্কটি দরকারী: npmjs.com/package/string-to-stream
ডেম Pilafian

এফওয়াইআই আমি এই লাইব্রেরিটি গুগল ড্রাইভে জেএসএন লেখার জন্য ব্যবহার করার চেষ্টা করেছি তবে এটি আমার পক্ষে কার্যকর হবে না। এখানে এই সম্পর্কে একটি নিবন্ধ লিখেছেন: माध्यम . com / @dupski/… । নীচের উত্তর হিসাবেও যুক্ত করা হয়েছে
রাসেল ব্রিগেস

6

কফি স্ক্রিপ্টে:

class StringStream extends Readable
  constructor: (@str) ->
    super()

  _read: (size) ->
    @push @str
    @push null

এটা ব্যবহার করো:

new StringStream('text here').pipe(stream1).pipe(stream2)

6

আর একটি সমাধান পঠনযোগ্য কনস্ট্রাক্টরের পাঠ্য ফাংশনটি পাঠিয়ে দিচ্ছে (সিএফ ডক স্ট্রিমের পাঠযোগ্যযোগ্য বিকল্পগুলি )

var s = new Readable({read(size) {
    this.push("your string here")
    this.push(null)
  }});

আপনি উদাহরণের জন্য s.pipe ব্যবহার করতে পারেন


শেষে ফিরে আসার উদ্দেশ্য কী?
কিরিল রেজনিকভ

"সর্বদা কিছু না কিছু (বা কিছুই নয়)" ডকুমেন্টেশন থেকে এই উদাহরণ mp
ফিলিপ টি।

জেএসে, যদি কোনও ফাংশনটির রিটার্ন না থাকে তবে এটি আপনার খালি ফেরতের সমতুল্য। আপনি যেখানে এটি পেয়েছেন দয়া করে একটি লিঙ্ক সরবরাহ করতে পারেন?
কিরিল রেজনিকভ

আপনার উচিত। আমি বললাম যে আরও ভাল অনুশীলনের জন্য। আমি কিছুই ফিরিয়ে দিতে চাই, এটি কোনও ভুল নয়। তাই আমি লাইনটি সরিয়েছি।
ফিলিপ টি।

5

আমি প্রতি ছয় মাসে এটি পুনরায় শিখতে ক্লান্ত হয়ে পড়েছিলাম, তাই আমি প্রয়োগের বিশদটি বিমূর্ত করার জন্য একটি এনপিএম মডিউল প্রকাশ করেছি:

https://www.npmjs.com/package/streamify-string

এটি মডিউলটির মূল:

const Readable = require('stream').Readable;
const util     = require('util');

function Streamify(str, options) {

  if (! (this instanceof Streamify)) {
    return new Streamify(str, options);
  }

  Readable.call(this, options);
  this.str = str;
}

util.inherits(Streamify, Readable);

Streamify.prototype._read = function (size) {

  var chunk = this.str.slice(0, size);

  if (chunk) {
    this.str = this.str.slice(size);
    this.push(chunk);
  }

  else {
    this.push(null);
  }

};

module.exports = Streamify;

strহয় stringযে invokation উপর কন্সট্রাকটর প্রেরণ করা আবশ্যক, এবং তথ্য যেমন প্রবাহ দ্বারা outputted করা হবে না। ডকুমেন্টেশনoptions অনুযায়ী আদর্শ বিকল্প যা প্রবাহে প্রবাহিত হতে পারে ।

ট্র্যাভিস সিআই এর মতে এটি নোডের বেশিরভাগ সংস্করণের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত।


2
আমি যখন প্রাথমিকভাবে এটি পোস্ট করেছি, তখন আমি প্রাসঙ্গিক কোডটি অন্তর্ভুক্ত করিনি, যা আমাকে বলা হয়েছিল যে তা ভ্রান্ত।
ক্রিস অ্যালেন লেন

2

টাইপস্ক্রিপ্টে একটি পরিচ্ছন্ন সমাধান:

import { Readable } from 'stream'

class ReadableString extends Readable {
    private sent = false

    constructor(
        private str: string
    ) {
        super();
    }

    _read() {
        if (!this.sent) {
            this.push(Buffer.from(this.str));
            this.sent = true
        }
        else {
            this.push(null)
        }
    }
}

const stringStream = new ReadableString('string to be streamed...')

1

জাভাস্ক্রিপ্ট হাঁস-টাইপযুক্ত, সুতরাং আপনি যদি কেবল একটি পঠনযোগ্য স্ট্রিমের এপিআই অনুলিপি করেন তবে এটি ঠিকঠাক কাজ করবে। প্রকৃতপক্ষে, আপনি সম্ভবত those পদ্ধতিগুলির বেশিরভাগ প্রয়োগ করতে পারবেন না বা কেবল স্টাব হিসাবে রেখে দিতে পারেন না; লাইব্রেরিটি যা ব্যবহার করে তা কার্যকর করার জন্য আপনার প্রয়োজন। আপনি নোড এর প্রাক বিল্ট ব্যবহার করতে পারেন EventEmitterবর্গ , খুব ঘটনা মোকাবেলা করার যাতে আপনি বাস্তবায়ন করতে হবে না addListenerএবং এই ধরনের নিজেকে।

আপনি কফিস্ক্রিপ্টে এটি কীভাবে প্রয়োগ করতে পারেন তা এখানে:

class StringStream extends require('events').EventEmitter
  constructor: (@string) -> super()

  readable: true
  writable: false

  setEncoding: -> throw 'not implemented'
  pause: ->    # nothing to do
  resume: ->   # nothing to do
  destroy: ->  # nothing to do
  pipe: -> throw 'not implemented'

  send: ->
    @emit 'data', @string
    @emit 'end'

তাহলে আপনি এটি এর মতো ব্যবহার করতে পারেন:

stream = new StringStream someString
doSomethingWith stream
stream.send()

আমি TypeError: string is not a function at String.CALL_NON_FUNCTION (native) এটি পেয়েছি : যখন আমি এটির মতো ব্যবহার করিnew StringStream(str).send()
pathikrit

জাভাস্ক্রিপ্টের কারণে হাঁসের টাইপিং ব্যবহার করা মানে এই নয় যে আপনার চাকাটি পুনরায় সাজানো উচিত। নোড ইতিমধ্যে স্ট্রিমগুলির জন্য একটি বাস্তবায়ন সরবরাহ করে। stream.Readable@ গ্রর্থ কিডের পরামর্শ মতো একটি নতুন উদাহরণ তৈরি করুন ।
সুকিমা

4
@ সুকিমা: আমি এই উত্তরটি লেখার সময় stream.Readable উপস্থিত ছিল না
অিক্টোফায়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.