Node.js 如何正确使用async/Wait读取文件?

Node.js 如何正确使用async/Wait读取文件?,node.js,asynchronous,readfile,Node.js,Asynchronous,Readfile,我无法理解async/await是如何工作的。我稍微明白一点,但我不能让它工作 函数loadMonoCounter(){ readFileSync(“monolitic.txt”,“binary”,异步函数(err,data){ 返回等待新缓冲区(数据); }); } module.exports.read=函数(){ log(loadMonoCounter()); }; 我知道我可以使用readFileSync,但如果我这样做,我知道我永远不会理解async/wait,我会把这个问题解决掉

我无法理解
async
/
await
是如何工作的。我稍微明白一点,但我不能让它工作

函数loadMonoCounter(){
readFileSync(“monolitic.txt”,“binary”,异步函数(err,data){
返回等待新缓冲区(数据);
});
}
module.exports.read=函数(){
log(loadMonoCounter());
};
我知道我可以使用
readFileSync
,但如果我这样做,我知道我永远不会理解
async
/
wait
,我会把这个问题解决掉

目标:调用
loadMonoCounter()
并返回文件内容

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


无论我做什么,控制台中都会出现错误或未定义。

要使用
wait
/
async
您需要返回承诺的方法。如果没有以下包装器,核心API函数就无法做到这一点:


请注意,
readFileSync
不接受回调,而是返回数据或引发异常。您没有获得所需的值,因为您提供的函数被忽略,并且您没有捕获实际的返回值。

因为节点v11.0.0 fs promise在没有promisify的情况下本机可用:

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

这是@Joel答案的打字版本。在节点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");

您可以使用自节点v11.0.0以来本机提供的
fs.promises

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);
}
分别导入
fs
fs.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,然后我将“promissions”放在fs变量中

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

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

fn();
看这个例子

//包含fs模块
var fs=需要('fs');
//使用fs.readFile()方法读取文件
fs.readFile('demo.txt',(错误,数据)=>{
控制台日志(数据);

})
核心API比现代Promise规范和采用
async
/
await
更早,因此这是一个必要的步骤。好消息是,
promisify
通常可以让它在没有混乱的情况下工作。这可以处理无法正常利用FS的异步等待的混乱情况。谢谢你!你救了我一吨!没有一个答案能像你的答案那样真正解决这个问题。还有等待是多余的,因为它是可以推断出来的。仅当您在示例中确实希望显式地使用wait时,您可以执行
const file=wait readFile。。。;返回文件@shijin,直到节点核心API切换到promises(目前不太可能),然后选择yes。不过,有一些NPM包装为你做这件事。我的英雄。谢谢你,先生。工作方式类似于charmno附加LIB,简洁明了-最好是在2019年10月21日,v12是从“fs”导入的活动LTS版本
import{promises as fs}如果您想使用导入语法。关于此方法的说明,虽然它是干净的,但它也不会在
fs.promises
api之外导入
fs
的其他有用功能。将
fs
fs.promises
分开导入可能很重要。一旦有了缓冲区,您可以使用缓冲区的方法
toString()
将其转换为字符串,如
bufferData.toString()
-请参阅。这是否回答了您的问题?Wait不是在异步函数中使用的吗?@VikasBhat是的,上面的Wait行将在另一个异步函数中使用,因为规范要求这样做。如果您只想使用承诺,可以执行类似于
const fs=require('fs')的操作。承诺
@nathanfranke这不是在import中使用import,您可以执行
import{promissions}从“fs”
弃用警告:由于安全性和可用性问题,Buffer()已弃用。请改用Buffer.alloc()、Buffer.allocUnsafe()或Buffer.from()方法。
const fsBase = require('fs');
const fs = fsBase.promises

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

fn();