在node.js中使用async / await中的文件系统

我想使用一些文件系统操作asynchronous/等待。 通常async / await可以正常工作,因为我使用了babel-plugin-syntax-async-functions

但有了这个代码,我遇到了names未定义的情况:

 import fs from 'fs'; async function myF() { let names; try { names = await fs.readdir('path/to/dir'); } catch (e) { console.log('e', e); } if (names === undefined) { console.log('undefined'); } else { console.log('First Name', names[0]); } } myF(); 

当我重build代码到callback地狱版本一切正常,我得到的文件名。 感谢您的提示。

从节点8.0.0开始,你可以使用这个:

 import fs from 'fs'; import {promisify} from 'util'; const readdir = promisify(fs.readdir); async function myF() { let names; try { {err, names} = await readdir('path/to/dir'); if (err) { // Handle the error. } } catch (e) { console.log('e', e); } if (names === undefined) { console.log('undefined'); } else { console.log('First Name', names[0]); } } myF(); 

请参阅https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original

您可能会产生错误的行为,因为File-Api fs.readdir没有返回承诺。 它只需要一个callback。 如果你想使用async-await语法,你可以像这样“promisify”这个函数:

 function readdirAsync(path) { return new Promise(function (resolve, reject) { fs.readdir(path, function (error, result) { if (error) { reject(error); } else { resolve(result); } }); }); } 

并改为调用它:

 names = await readdirAsync('path/to/dir'); 

这是什么对我有用:

 const fsp = require('fs-promise'); (async () => { try { const names = await fsp.readdir('path/to/dir'); console.log(names[0]); } catch (e) { console.log('error: ', e); } })(); 

当和谐标志被启用时,这个代码在没有babel的节点7.6中工作: node --harmony my-script.js 。 而从节点7.7开始, 你甚至不需要这个标志 !

包含在开头的fsp库只是fs (和fs-ext )的一个promisified包装。

我真的很高兴能够在没有babel的情况下在节点上做些什么! 本地async / await使编写代码如此的愉快!

UPDATE 2017-06: fs-promise模块已被弃用。 使用fs-extra而不是使用相同的API。

Node.js 8.0.0

本地asynchronous/等待

 const fs = require('fs') const readFile = (path, opts = 'utf8') => new Promise((res, rej) => { fs.readFile(path, opts, (err, data) => { if (err) rej(err) else res(data) }) }) const writeFile = (path, data, opts = 'utf8') => new Promise((res, rej) => { fs.writeFile(path, data, opts, (err) => { if (err) rej(err) else res() }) }) module.exports = { readFile, writeFile } 

用法

总是使用try..catch等待块,如果你不想重新回答上面的答案。

 // in some module, with imported function // in async block const res = await readFile('data.json') console.log(res)