JavaScript: неопределенный тип при попытке вернуть строку после чтения файла - PullRequest
1 голос
/ 21 февраля 2020

Я новичок в JavaScript и пишу JS код в Node.JS v12.13.1.

Я пытаюсь прочитать файл асинхронно и вернуть строковое значение с помощью обещаний.

Пока что большинство функций возвращают значение undefined, в то время как другие возвращают значение [Promise объекта].

Функция writeFile работает, и я могу проверить, что out.txt содержит " Тестовые данные "

Я провел исследование постов переполнения стека, и я просто запутался.
Как правильно прочитать файл с помощью async / await?
Использование файловой системы в node.js с asyn c / await
Использование Promises с fs.readFile в al oop

Документация API:
https://nodejs.org/api/fs.html#fs_fs_promises_api

Может ли кто-нибудь объяснить мне, что мне не хватает? Это было бы очень признательно, так как я исследовал методом проб и ошибок около 3 полных дней.

Спасибо!

function writeFile(data) {
    const fs = require('fs');
    fs.writeFile('out.txt', data, (err) => {
        if (err) throw err;
    });
}

function readFile1() {
    const fs = require('fs').promises;
    (async() =>  {
    try {
      const result = await fs.readFileSync('out.txt', 'utf8');
      console.log(result);
   } catch(e) {
      console.error(e);
   }
    })();
}

function readFile2() {
    const fs = require('fs');
    const { promisify } = require('util');
    const readFile = promisify(fs.readFile);

    (async() =>  {
    try {
        const result = await readFile('out.txt', 'utf8');
        console.log(result);
    } catch(e) {
        console.error(e);
    }
    })();
}

function readFile3() {
    const fs = require('fs');
    const util = require('util');
    const readFile = util.promisify(fs.readFile);

    function getStuff() {
        return readFile('out.txt', 'utf8');
    }
    getStuff().then(data => {
        console.log("Inside getStuff Method: "+data);
    })
}

function readFile4() {
    const fs = require('fs');    
    const fsPromises = fs.promises;
  try {  
    return fsPromises.readFile('out.txt');
  } catch (err) {
    console.error('Error occured while reading file!', err);
  }
}

async function readFile5() {
    const fs = require('fs');
    const fsPromises = fs.promises;
    let fileHandle = null;
    try {
        fileHandle = await fsPromises.open('out.txt');
        await fileHandle.readFile();
    } finally {
        if (fileHandle) {
            await fileHandle.close();
        }
    }
    return fs.readFileSync('out.txt', 'utf8');
}

writeFile("Test Data");
myString = readFile5();
console.log("The String Value is: " + myString);

Ответы [ 3 ]

2 голосов
/ 21 февраля 2020

открыть файл в режиме чтения

fileHandle = await fsPromises.open('out.txt','r');

затем.

вы можете сделать, как показано ниже

 async function getPromiseResolved() {
    writeFile("Test Data");
    myString =  await readFile5();
    console.log("The String Value is: " + myString);
    }

getPromiseResolved()

{ ссылка }

полный код

// This is your Editor pane. Write your JavaScript here and 
// use the command line to execute commands

function writeFile(data) {
  const fs = require('fs');
  fs.writeFile('out.txt', data, (err) => {
    if (err) throw err;
  });
}

async function readFile5() {
  const fs = require('fs');
  const fsPromises = fs.promises;
  let fileHandle = null;
  try {
    fileHandle = await fsPromises.open('out.txt', 'r');
    await fileHandle.readFile();
  } finally {
    if (fileHandle) {
      await fileHandle.close();
    }
  }
  var myString = await fs.readFileSync('out.txt', 'utf8');
  return myString;
}
async function getPromiseResolved() {
  writeFile("Test Data");
  myString = await readFile5();

  console.log("The String Value is: " + myString);
}

getPromiseResolved()
0 голосов
/ 21 февраля 2020

Вы можете сделать это:

const fs = require('fs')

const readFile = filepath =>
   new Promise((resolve, reject) => 
      fs.readFile(filepath, 'utf-8', 
         (err, result) => err ? reject(err): resolve(result)))

Это в основном то, что promisify делает с методом. Вот как вы можете преобразовать любую функцию в стиле обратного вызова для возврата Promise.

0 голосов
/ 21 февраля 2020

Вы были близки к успеху. Я думаю, это то, что вы искали:

function myReadFile() {
    const fs = require('fs');
    const {
        promisify
    } = require('util');
    const readFile = promisify(fs.readFile);

    try {
        return readFile('out.txt', 'utf8');
    } catch (e) {
        console.error(e);
    }
}

myString = await myReadFile();
console.log("The String Value is: " + myString);

Обратите внимание, что ожидание верхнего уровня является довольно новым и не реализовано в более старых Node.js версиях.

Если вы не можете использовать ожидание верхнего уровня, сделайте следующее:

(async function() {
    myString = await myReadFile();
    console.log("The String Value is: " + myString);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...