FS readFile returns get 请求中没有任何内容
FS readFile returns nothing in a get request
每当有人向我的服务器发出获取请求时,我都会尝试 return 来自 .txt 文件的值。
但是问题是,即使我在发送结果之前异步等待结果,我也总是得到 undefined 返回。
有人可以帮我吗?
这是我在 get 请求中调用的辅助函数。
const fs = require('fs');
const fileName = './utils/readme.txt'
const getMoviesData = async () => {
fs.readFile(fileName, 'utf8', (err, data) => {
if (err) {
console.log(err)
}
console.log(data) // The text does show up here but not inside of my get request
return data
})
}
module.exports = getMoviesData
这是我的后端代码。
const express = require('express')
const app = express();
// Utility functions (helpers)
const getMoviesData = require('./utils/getMoviesData')
const PORT = process.env.port || 5000
app.get('/', async (req, res) => {
const data = await getMoviesData()
console.log("Returns: " + data) // here is where all my problems start, it returns undefined
res.send(data)
})
app.listen(PORT, () => {
console.log(`Listening on port: ` + PORT)
})
我不明白为什么会这样?我的 async/await 语法错误吗?
您必须 return 一个承诺,并且由于 fs.readFile
使用回调,您必须将其包装在一个中。
在您的代码中,您做了 return 承诺,但您没有 await
任何东西,也没有任何东西可以等待,因为没有什么可等待的。您的控制台日志记录了数据,因为它被称为异步,而您的函数 return 什么也没做,因为 return
语句发生在异步线程中。
下面的代码应该可以工作
const fs = require("fs");
const fileName = "./utils/readme.txt";
const getMoviesData = () => {
return new Promise((resolve, reject) => {
fs.readFile(fileName, "utf8", (err, data) => {
if (err) {
reject(err);
}
console.log(data);
resolve(data);
});
});
};
module.exports = getMoviesData;
正如@jfriend00 指出的那样,您还可以使用 node >= 10.
附带的基于承诺的 readFile
函数
const { readFile } = require("fs/promises");
const fileName = "./utils/readme.txt";
const getMoviesData = () => {
return readFile(fileName, "utf8");
};
module.exports = getMoviesData;
您 getMoviesData()
函数需要 return 一个在您的文件操作完成时解决的承诺。现在,它 return 是一个承诺(因为它被声明为 async
),在您的文件操作完成之前立即解决。
因为 nodejs 已经 built-in 承诺支持文件操作,我建议这个实现:
const fsp = require('fs').promises;
const fileName = './utils/readme.txt'
const getMoviesData = () => {
return fsp.readFile(fileName, 'utf8');
}
module.exports = getMoviesData
这样 getMoviesData()
returns 的承诺直接与文件读取操作完成的时间相关联,任何错误都直接与拒绝该承诺相关联。
每当有人向我的服务器发出获取请求时,我都会尝试 return 来自 .txt 文件的值。 但是问题是,即使我在发送结果之前异步等待结果,我也总是得到 undefined 返回。 有人可以帮我吗?
这是我在 get 请求中调用的辅助函数。
const fs = require('fs');
const fileName = './utils/readme.txt'
const getMoviesData = async () => {
fs.readFile(fileName, 'utf8', (err, data) => {
if (err) {
console.log(err)
}
console.log(data) // The text does show up here but not inside of my get request
return data
})
}
module.exports = getMoviesData
这是我的后端代码。
const express = require('express')
const app = express();
// Utility functions (helpers)
const getMoviesData = require('./utils/getMoviesData')
const PORT = process.env.port || 5000
app.get('/', async (req, res) => {
const data = await getMoviesData()
console.log("Returns: " + data) // here is where all my problems start, it returns undefined
res.send(data)
})
app.listen(PORT, () => {
console.log(`Listening on port: ` + PORT)
})
我不明白为什么会这样?我的 async/await 语法错误吗?
您必须 return 一个承诺,并且由于 fs.readFile
使用回调,您必须将其包装在一个中。
在您的代码中,您做了 return 承诺,但您没有 await
任何东西,也没有任何东西可以等待,因为没有什么可等待的。您的控制台日志记录了数据,因为它被称为异步,而您的函数 return 什么也没做,因为 return
语句发生在异步线程中。
下面的代码应该可以工作
const fs = require("fs");
const fileName = "./utils/readme.txt";
const getMoviesData = () => {
return new Promise((resolve, reject) => {
fs.readFile(fileName, "utf8", (err, data) => {
if (err) {
reject(err);
}
console.log(data);
resolve(data);
});
});
};
module.exports = getMoviesData;
正如@jfriend00 指出的那样,您还可以使用 node >= 10.
附带的基于承诺的readFile
函数
const { readFile } = require("fs/promises");
const fileName = "./utils/readme.txt";
const getMoviesData = () => {
return readFile(fileName, "utf8");
};
module.exports = getMoviesData;
您 getMoviesData()
函数需要 return 一个在您的文件操作完成时解决的承诺。现在,它 return 是一个承诺(因为它被声明为 async
),在您的文件操作完成之前立即解决。
因为 nodejs 已经 built-in 承诺支持文件操作,我建议这个实现:
const fsp = require('fs').promises;
const fileName = './utils/readme.txt'
const getMoviesData = () => {
return fsp.readFile(fileName, 'utf8');
}
module.exports = getMoviesData
这样 getMoviesData()
returns 的承诺直接与文件读取操作完成的时间相关联,任何错误都直接与拒绝该承诺相关联。