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