let arr = [];
function getData(fileName, type) {
return fs.readFile(fileName,'utf8', (err, data) => {
if (err) throw err;
return new Promise(function(resolve, reject) {
for (let i = 0; i < data.length; i++) {
arr.push(data[i]);
}
resolve();
});
});
}
getData('./file.txt', 'sample').then((data) => {
console.log(data);
});
当我使用上面的代码并使用nodejs在命令行中运行时,我得到以下错误。
getData('./file.txt', 'sample').then((data) => {
^
TypeError: Cannot read property 'then' of undefined
我该如何解决这个问题?
答案 0 :(得分:22)
您希望将整个public void GetAllViews2()
{
foreach (var uControls in uControlList)
{
uControls newControl = uControls();
viewList.Add(newControl);
}
}
调用包装在新的fs.readFile
中,然后根据回调结果拒绝或解决该承诺:
Promise
答案 1 :(得分:13)
没有人告诉我util.promisify
所以我要发帖,不管这个问题多大了。
你为什么要收到这条消息?
getData('./file.txt', 'sample').then((data) => {
^
TypeError: Cannot read property 'then' of undefined
getData
是此处fs.readFile
文件的包装器。 fs.readfile
不是一个可行的(它没有实现then
函数)。它建立在其他模式上,即回调模式。最着名的是Promises,这就是你想从readFile
得到的东西。一点提醒:Mozilla - Promises
所以你可以做的就是像@hackerrdave一样自己实现它,或者我建议使用promisify
:这个函数是Node.js的内置函数,它被实现来转换基于回调的函数成为承诺的基础。你会在这里找到它:Node.js Documentation for util.promisfy
它基本上与@hackerrdave相同,但它更强大,内置节点util。
以下是如何使用它:
const util = require('util');
const fs = require('fs');
const readFile = util.promisify(fs.readFile)
readFile("path/to/myfile").then(file => console.log(file))
答案 2 :(得分:8)
redis-server
答案 3 :(得分:8)
这是节点10.2.0的单行:
destructor
是的,它现在开箱即用。
答案 4 :(得分:6)
从节点12+开始,您可以使用fs.promises
API。
请参见以下示例:
const { readFile } = require('fs').promises
readFile('./file.txt', { encoding: 'utf8' })
.then((data) => console.log(data))
.catch((error) => console.error(error));
使用异步/等待
const { readFile } = require('fs').promises
async function readFile(filePath) {
try {
const data = await readFile(filePath, { encoding: 'utf8' })
console.log(data)
} catch (error) {
console.error(error.message)
}
}
readFile('./file.txt')
答案 5 :(得分:1)
更新当前节点,从节点10.0.0开始,您现在可以使用fs.promises
:
const fs = require('fs')
(async function(){
var fileContents = await fs.promises.readFile(FILENAME)
var data = JSON.parse(fileContents)
})()