如何正确读取 async/await 文件?

How to read file with async/await properly?

我不知道 async/await 是如何工作的。有点看懂了,就是做不出来

function loadMonoCounter() {
    fs.readFileSync("monolitic.txt", "binary", async function(err, data) {
       return await new Buffer( data);
  });
}

module.exports.read = function() {
  console.log(loadMonoCounter());
};

我知道,我可以使用 readFileSync,但如果我这样做,我知道我永远无法理解 async/await,我将把这个问题埋葬。

目标:调用loadMonoCounter()和return一个文件的内容。

每次调用 incrementMonoCounter()(每次加载页面)时,该文件都会递增。该文件包含二进制缓冲区的转储并存储在 SSD 上。

无论我做什么,我都会在控制台中收到错误或 undefined

要使用 await/async,您需要 return 承诺的方法。如果没有像 promisify:

这样的包装器,核心 API 函数就不会这样做
const fs = require('fs');
const util = require('util');

// Convert fs.readFile into Promise version of same    
const readFile = util.promisify(fs.readFile);

function getStuff() {
  return readFile('test');
}

// Can't use `await` outside of an async function so you need to chain
// with then()
getStuff().then(data => {
  console.log(data);
})

请注意,readFileSync 不接受回调,它 return 发送数据或抛出异常。你没有得到你想要的值,因为你提供的那个函数被忽略了,你没有捕获实际的 return 值。

自从 Node v11.0.0 fs promises 在没有 promisify 的情况下本机可用:

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

这是@Joel 回答的 TypeScript 版本。在 Node 11.0 之后可用:

import { promises as fs } from 'fs';

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

您可以轻松地用这样的承诺包装 readFile 命令:

async function readFile(path) {
    return new Promise((resolve, reject) => {
      fs.readFile(path, 'utf8', function (err, data) {
        if (err) {
          reject(err);
        }
        resolve(data);
      });
    });
  }

然后使用:

await readFile("path/to/file");

您可以使用 fs.promises 自 Node v11.0.0 起本机可用

import fs from 'fs';

const readFile = async filePath => {
  try {
    const data = await fs.promises.readFile(filePath, 'utf8')
    return data
  }
  catch(err) {
    console.log(err)
  }
}

有一个fs.readFileSync( path, options )方法,是同步的

为了保持简洁并保留 fs 的所有功能:

const fs = require('fs');
const fsPromises = fs.promises;

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

分别导入 fsfs.promises 将提供对整个 fs API 的访问权限,同时也使它更具可读性......所以就像下一个例子很容易做到。

// the 'next example'
fsPromises.access('monolitic.txt', fs.constants.R_OK | fs.constants.W_OK)
    .then(() => console.log('can access'))
    .catch(() => console.error('cannot access'));

您可以在下面找到我的方法: 首先,我需要 fs 作为 fsBase,然后我将“承诺”放入 fs 变量中。

const fsBase = require('fs');
const fs = fsBase.promises

const fn = async () => {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log(data);
};

fn();

看这个例子 https://www.geeksforgeeks.org/node-js-fs-readfile-method/

// Include fs module
var fs = require('fs');
  
// Use fs.readFile() method to read the file
fs.readFile('demo.txt', (err, data) => {
  console.log(data);
})

来自节点 v14.0.0

const {readFile} = require('fs/promises');

const myFunction = async()=>{
    const result = await readFile('monolitic.txt','binary')
    console.log(result)
}

myFunction()
const fs = require("fs");
const util = require("util");
const readFile = util.promisify(fs.readFile);
const getContent = async () => {
let my_content;
try {
  const { toJSON } = await readFile("credentials.json");
  my_content = toJSON();
  console.log(my_content);
} catch (e) {
  console.log("Error loading client secret file:", e);
 }
};

我使用 Promise 读取文件。对我来说是正确的:

const fs = require('fs')

//function which return Promise
const read = (path, type) => new Promise((resolve, reject) => {
  fs.readFile(path, type, (err, file) => {
    if (err) reject(err)
    resolve(file)
  })
})

//example how call this function
read('file.txt', 'utf8')
    .then((file) => console.log('your file is '+file))
    .catch((err) => console.log('error reading file '+err))

//another example how call function inside async
async function func() {
  let file = await read('file.txt', 'utf8')
  console.log('your file is '+file)
}