【问题标题】:JavaScript: Undefined type when attempting to return a string after reading a fileJavaScript:读取文件后尝试返回字符串时未定义类型
【发布时间】:2020-06-05 08:13:57
【问题描述】:

我是 JavaScript 新手,在 Node.JS v12.13.1 中编写 JS 代码。

我正在尝试异步读取文件并通过承诺返回字符串值。

到目前为止,大多数函数返回 undefined 值,而其他函数返回 [object Promise] 值。

writeFile 函数有效,我可以验证 out.txt 是否包含“测试数据”

我对堆栈溢出帖子进行了研究,我只是感到困惑。
How to read file with async/await properly?
Using filesystem in node.js with async / await
Using Promises with fs.readFile in a loop

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

【问题讨论】:

  • readFile5 是异步的......因此,在执行 myString = readFile5(); 时 - 保证 myString 将是一个 Promise,无论您在该函数中做什么(对或错),它返回一个承诺
  • @JaromandaX 好的,它返回承诺是有道理的,它在我的控制台中显示为:“字符串值是:[object Promise]”---但我感到困惑的是如何让实际文本“测试数据”显示而不是 [object Promise],也许我错过了一步?
  • promise 有一个.then 方法...或者使用 async/await
  • @JaromandaX 非常感谢,我记得 Rahul Shetty 在 udemy 上通过 AngularJS 粗略地完成了这个,他也解释了 promise 的 then() 方法。感谢您抽出宝贵时间帮助我解决这个问题;)

标签: javascript node.js asynchronous promise


【解决方案1】:

以读取模式打开文件

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

那么。

你可以像下面那样做

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

getPromiseResolved()

https://stackoverflow.com/a/29516570/6302996

完整代码

// 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()

【讨论】:

  • 效果很好!非常感谢您在这方面的帮助! =) 我认为这对于其他有同样困难的人来说非常有价值。
【解决方案2】:

你可以这样做:

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 的方法。

【讨论】:

  • 谢谢你的分享,我会把它添加到我的知识库中;)
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多