如何正确地读取异步/等待文件?

我无法弄清楚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上。

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

227235 次浏览

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

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不接受回调,而是返回数据或抛出异常。你没有得到你想要的值,因为你提供的函数被忽略了,你没有捕捉到实际的返回值。

因为Node v11.0.0 fs承诺在没有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");

自Node 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);
}

分别导入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,然后我把"promises"

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/ < / p >

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

这将从你的文件内容中产生一个字符串,你不需要使用承诺来工作

const fs = require('fs');
const data = fs.readFileSync("./path/to/file.json", "binary");