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

时间:2017-10-21 20:00:21

标签: node.js asynchronous readfile

我无法弄清楚 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()并返回文件内容。

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

不管我做什么,我在控制台中收到错误或未定义

10 个答案:

答案 0 :(得分:99)

要使用await / async,您需要返回承诺的方法。没有像promisify这样的包装器,核心API函数不会这样做:

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

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

async function getStuff() {
  return await 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不接受回调,它返回数据或抛出异常。您没有获得所需的值,因为您提供的功能被忽略,而您没有捕获实际的返回值。

答案 1 :(得分:13)

您可以使用{v1.0.0自Node v11.0.0起提供的本地版本的.footer-content nav a { margin: 100px; color: yellow; text-decoration: underline; }

<footer>
  <div class="footer-content">
    <h3>Sweet Eats Bakery</h3>
    <nav>
      <a href="#">About</a>
      <a href="#">Cookies</a>
      <a href="#">Weddings</a>
      <a href="#">Catering</a>
      <a href="#">Contact</a>
    </nav>
    <p class="copyright">&copy; Sweet Eats 2018</p>
  </div>
</footer>

答案 2 :(得分:6)

您可以像这样用promise轻松包装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");

答案 3 :(得分:5)

这是@Joel答案的打字稿版本。在节点11.0之后可用:

import { promises as fs } from 'fs';

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

答案 4 :(得分:4)

因为Node v11.0.0 fs promises可以在没有promisify的情况下本地使用:

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

答案 5 :(得分:4)

为使其简洁并保留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'));

答案 6 :(得分:4)

来自节点 v14.0.0

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

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

myFunction()

答案 7 :(得分:2)

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

答案 8 :(得分:0)

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

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

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

fn();

答案 9 :(得分:-1)

看这个例子 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);
})