Async / প্রতীক্ষার সাথে নোড.জেজে ফাইল সিস্টেম ব্যবহার করা


129

আমি কিছু ফাইল সিস্টেম অপারেশন সহ অ্যাসিঙ্ক / অপেক্ষা করতে চাই। সাধারণত অ্যাসিঙ্ক / অপেক্ষারত ভাল কাজ করে কারণ আমি ব্যবহার করি babel-plugin-syntax-async-functions

তবে এই কোডটি দিয়ে আমি যদি সেই ক্ষেত্রে সংশোধন করি যেখানে namesঅনির্ধারিত থাকে:

import fs from 'fs';

async function myF() {
  let names;
  try {
    names = await fs.readdir('path/to/dir');
  } catch (e) {
    console.log('e', e);
  }
  if (names === undefined) {
    console.log('undefined');
  } else {
    console.log('First Name', names[0]);
  }
}

myF();

আমি যখন কোডটি কলব্যাক হেল্প সংস্করণে পুনর্নির্মাণ করি তখন সবকিছু ঠিক থাকে এবং আমি ফাইলের নামগুলি পাই। আপনার ইঙ্গিতগুলির জন্য ধন্যবাদ।

উত্তর:


139

নোড 8.0.0 দিয়ে শুরু করে আপনি এটি ব্যবহার করতে পারেন:

const fs = require('fs');
const util = require('util');

const readdir = util.promisify(fs.readdir);

async function myF() {
  let names;
  try {
    names = await readdir('path/to/dir');
  } catch (err) {
    console.log(err);
  }
  if (names === undefined) {
    console.log('undefined');
  } else {
    console.log('First Name', names[0]);
  }
}

myF();

Https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original দেখুন


7
নোড v8.9.4 এ, একটি SyntaxError: Unexpected token importত্রুটি বার্তা পেয়েছে । নোড 8 importডিফল্টরূপে টোকেনকে সমর্থন করে?
makerj

9
@ নির্মাতা তিনি নতুন importসিনট্যাক্স ব্যবহার করছেন । এটি বর্তমানে কিছু সংশোধন প্রয়োজন। এটি ব্যবহার করা ঠিক হবে const fs = require('fs')বাconst { promisify } = require('util')
জোশ স্যান্ডলিন

2
খুব প্রশ্ন, কিন্তু {err, names} = functionসিনট্যাক্স কী বলা হয়?
কাসিম

6
@ কাসিম এটিকে ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট বলে।
jaredkwright

1
@ আলেকজান্ডারজিটলার এটি সত্য হতে পারে। আমি আসলে এটি ধ্বংসাত্মক সঠিক ব্যবহার কিনা তা দেখার জন্য তাকাইনি। অ্যাসিঙ্কের অপেক্ষার ক্ষেত্রে আমি মনে করি আপনি কেবল এটি করবেন names = await readdir('path/to/dir');এবং যদি ব্লকে কোনও errহ্যান্ডেল থাকে catch। যেভাবেই হোক সিন্টেক্সের নামটি হ'ল ডিস্ট্রাকচারিং অ্যাসাইনমেন্ট যা কাসিমের প্রশ্নের জবাবে ছিল।
জেরেডকোয়র্ট

88

নোড 11 থেকে async এর জন্য স্থানীয় সমর্থন fs ফাংশনের জন্য অপেক্ষা করছে

নোড.জেএস ১১.০.০ (স্থিতিশীল) এবং সংস্করণ ১০.০.০ (পরীক্ষামূলক), আপনার কাছে ইতিমধ্যে প্রতিশ্রুতিবদ্ধ ফাইল সিস্টেমের পদ্ধতিতে অ্যাক্সেস try catchরয়েছে এবং কলব্যাকের ফিরে পাওয়া মান রয়েছে কিনা তা পরীক্ষা না করে আপনি এগুলি ব্যতিক্রম হ্যান্ডলিং সহ ব্যবহার করতে পারেন checking একটি ভুল.

এপিআই খুব পরিষ্কার এবং মার্জিত! কেবল অবজেক্টের .promisesসদস্য ব্যবহার করুন fs:

import fs from 'fs';
const fsPromises = fs.promises;

async function listDir() {
  try {
    return fsPromises.readdir('path/to/dir');
  } catch (err) {
    console.error('Error occured while reading directory!', err);
  }
}

listDir();

এই এপিআই নোড.জেএস সাইটে ফাইল সিস্টেম ডকুমেন্টেশন অনুযায়ী ১১.০ সংস্করণ হিসাবে স্থিতিশীল
দ্য হান্না

1
@ ডানস্টার্নস আপনি যদি return awaitআপনার প্রতিশ্রুতি না দেন, ক্যাচ ব্লকটি কোনও কাজে আসেনি ... আমি কখনও কখনও ফিরে আসার আগে অপেক্ষা করা ভাল অনুশীলন বলে মনে করি
৫৩৮ রোজ

@ 538ROMEO সবেমাত্র এটি এবং আপনার ডানদিকে নজর দিয়েছে। এটা ইশারা জন্য ধন্যবাদ।
ড্যানস্টার্নস

এই বিকল্প পদ্ধতির জন্য ডকুমেন্টেশন: nodejs.org/api/fs.html#fs_fs_promises_api
জীবন তখর

87

নোড.জেএস 8.0.0

নেটিভ অ্যাসিঙ্ক / অপেক্ষা করুন

Promisify

এই সংস্করণ থেকে, আপনি ব্যবহারের লাইব্রেরি থেকে নেটিড Node.js ফাংশন ব্যবহার করতে পারেন ।

const fs = require('fs')
const { promisify } = require('util')

const readFileAsync = promisify(fs.readFile)
const writeFileAsync = promisify(fs.writeFile)

const run = async () => {
  const res = await readFileAsync('./data.json')
  console.log(res)
}

run()

প্রতিশ্রুতি আবরণ

const fs = require('fs')

const readFile = (path, opts = 'utf8') =>
  new Promise((resolve, reject) => {
    fs.readFile(path, opts, (err, data) => {
      if (err) reject(err)
      else resolve(data)
    })
  })

const writeFile = (path, data, opts = 'utf8') =>
  new Promise((resolve, reject) => {
    fs.writeFile(path, data, opts, (err) => {
      if (err) reject(err)
      else resolve()
    })
  })

module.exports = {
  readFile,
  writeFile
}

...


// in some file, with imported functions above
// in async block
const run = async () => {
  const res = await readFile('./data.json')
  console.log(res)
}

run()

পরামর্শ

try..catchআপনি যদি ব্যতিক্রমটিকে উপরের দিকে পুনর্বিবেচনা করতে না চান তবে সর্বদা অপেক্ষারত ব্লকগুলির জন্য ব্যবহার করুন ।


এটা অদ্ভুত. আমি সিনট্যাক্স এরির পাচ্ছি: অপেক্ষা কেবলমাত্র অ্যাসিঙ্ক ফাংশনেই বৈধ ... রাগে কান্নাকাটি।
বেদরান মেরিসেভিক।

2
@VedranMaricevic। মন্তব্যগুলি দেখুন, awaitঅবশ্যই সর্বদা asyncব্লক হওয়া উচিত :)
ডিম্পিয়াक्स

@VedranMaricevic। আপনাকে const res = await readFile('data.json') console.log(res)কোনও অ্যাসিঙ্ক ফাংশনটিতে এটি কল করতে হবে
জয়রাজ

প্রতিশ্রুতি মোড়ানো fs.promisesএবং এর সাথে ব্যবহার async/awaitকরা আমার কাছে এত বিভ্রান্তিকর
oldboy

@PrimitiveNom প্রতিশ্রুতি মধ্যে ঐতিহ্যগত ভাবে ব্যবহার করা যেতে পারে then, catchইত্যাদি কোথায় ASYNC / অপেক্ষায় রয়েছেন আধুনিক আচরণ প্রবাহ হয়।
ডিম্পিয়াাক্স

43

আপনি ভুল আচরণ তৈরি করতে পারেন কারণ ফাইল-এপি fs.readdirকোনও প্রতিশ্রুতি দেয় না। এটি কেবল একটি কলব্যাক নেয়। আপনি যদি অ্যাসিঙ্ক-অপেক্ষার সিনট্যাক্সের সাথে যেতে চান তবে আপনি এই জাতীয় ফাংশনটির 'প্রতিশ্রুতি' দিতে পারেন:

function readdirAsync(path) {
  return new Promise(function (resolve, reject) {
    fs.readdir(path, function (error, result) {
      if (error) {
        reject(error);
      } else {
        resolve(result);
      }
    });
  });
}

এবং পরিবর্তে এটি কল:

names = await readdirAsync('path/to/dir');

31

ভি 10.0 হিসাবে , আপনি ব্যবহার করতে পারেনfs.Promises

ব্যবহার উদাহরণ readdir

const { promises: fs } = require("fs");

async function myF() {
    let names;
    try {
        names = await fs.readdir("path/to/dir");
    } catch (e) {
        console.log("e", e);
    }
    if (names === undefined) {
        console.log("undefined");
    } else {
        console.log("First Name", names[0]);
    }
}

myF();

ব্যবহার উদাহরণ readFile

const { promises: fs } = require("fs");

async function getContent(filePath, encoding = "utf-8") {
    if (!filePath) {
        throw new Error("filePath required");
    }

    return fs.readFile(filePath, { encoding });
}

(async () => {
    const content = await getContent("./package.json");

    console.log(content);
})();

ExperimentalWarning: The fs.promises API is experimentalসতর্কতা সম্পর্কিত উন্মুক্ত ইস্যুটি নোট করা দুর্দান্ত, তবে গুরুত্বপূর্ণ কাজ করে : github.com/pnpm/pnpm/issues/1178
ডেভিডপি

1
@ ডেভিডপি আপনি নোডের কোন সংস্করণ ব্যবহার করছেন? 12 এবং
তদূর্ধের

2
হ্যাঁ! একেবারে সঠিক - আমি যে সংস্করণে রয়েছি তা অবহেলা করেছি: v10.15.3- বার্তাটি দমন করা সম্ভব possible তবে ইস্যুটি এখনও খোলা থাকায় আমি এটি উল্লেখ করার মতো মনে করেছি।
ডেভিডপি

1
@ ডেভিডপি আমার অর্থ এটি ভুল হওয়া উচিত বলে উল্লেখ করা উচিত, তবে নোড 12 এখন এলটিএসে রয়েছে সুতরাং এটি কোনও বিগী নয়।
ড্যানস্টার্নস 12:53

আপনি ঠিক কীভাবে এটি ব্যবহার করেন, বলুন readFile? এই পুরো প্রতিশ্রুতি বিষয়গুলিতে আমি নতুন, এবং আমি যা করতে চাই তার একটি ফাংশন getContentযা আমি আমার স্ক্রিপ্ট জুড়ে বিভিন্ন অংশে কল করতে এবং অপেক্ষা করতে পারি, তবুও এটি খুব বিভ্রান্তিকর প্রমাণিত হয়
oldboy

8

এটি প্রশ্নের টাইপস্ক্রিপ্ট সংস্করণ। নোড 11.0 এর পরে এটি ব্যবহারযোগ্য:

import { promises as fs } from 'fs';

async function loadMonoCounter() {
    const data = await fs.readFile('monolitic.txt', 'binary');
    return Buffer.from(data);
}

5

আমার জন্য যা কাজ করেছে তা এখানে:

const fsp = require('fs-promise');

(async () => {
  try {
    const names = await fsp.readdir('path/to/dir');
    console.log(names[0]);
  } catch (e) {
    console.log('error: ', e);
  }
})();

এই কোড নোড 7.6 কাজ করে Babel ছাড়া যখন সাদৃশ্য পতাকা সক্ষম আছে: node --harmony my-script.js। এবং নোড 7.. with দিয়ে শুরু করে, আপনার এমনকি এই পতাকাটির প্রয়োজন নেই !

fspগ্রন্থাগার শুরুতে অন্তর্ভুক্ত জন্য শুধু একটি promisified মোড়কের হয় fs(এবং fs-ext)।

এই দিনগুলিতে বাবেল ছাড়া আপনি নোডে কী করতে পারেন সে সম্পর্কে আমি সত্যিই উত্সাহিত! নেটিভ async/ awaitমেকিং রাইটিং কোডটি এমন আনন্দ!

আপডেট ২০১-0-০ f: এফএস-প্রতিশ্রুতি মডিউল অবনতি হয়েছে। fs-extraপরিবর্তে একই এপিআই ব্যবহার করুন ।


এর জন্য একটি লাইব্রেরি ডাউনলোড করা খাঁটি ওভার্কিল, নির্ভরতা পুষ্পিতকরণ এমন একটি বিষয় যা সম্প্রদায়ের বিরুদ্ধে দৃ be়তার সাথে হওয়া উচিত, একটি নতুন এনপিএমজেস তৈরি হওয়া উচিত যা কেবল 0 নির্ভরতার সাথে
লিবস রয়েছে

5

কাস্টম ফাংশনগুলির তুলনায় কোনও এনপিএম প্যাকেজ যেমন https://github.com/davetemplin/async-file ব্যবহার করার পরামর্শ দিন । উদাহরণ স্বরূপ:

import * as fs from 'async-file';

await fs.rename('/tmp/hello', '/tmp/world');
await fs.appendFile('message.txt', 'data to append');
await fs.access('/etc/passd', fs.constants.R_OK | fs.constants.W_OK);

var stats = await fs.stat('/tmp/hello', '/tmp/world');

অন্যান্য উত্তরগুলি পুরানো


5

আমার কাছে এই সামান্য সহায়ক মডিউলটি রয়েছে যা ফাংশনগুলির প্রতিশ্রুতিবদ্ধ সংস্করণ রফতানি fsকরে

const fs = require("fs");
const {promisify} = require("util")

module.exports = {
  readdir: promisify(fs.readdir),
  readFile: promisify(fs.readFile),
  writeFile: promisify(fs.writeFile)
  // etc...
};

1

নোড v14.0.0 এবং উপরে

আপনি ঠিক করতে পারেন:

import { readdir } from "fs/promises";

আপনি যেমনটি থেকে আমদানি করবেন ঠিক তেমন "fs"

আরও তথ্যের জন্য এই জনসংযোগ দেখুন: https://github.com/nodejs/node/pull/31553

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.