每当有人向我的服务器发出get请求时,我都试图从.txt文件返回值。 但是有一个问题是,即使我在发送结果之前异步等待结果,也一直都无法得到定义。 有人可以帮我吗?
这是我在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)
})
我不明白为什么会这样?我的异步/等待语法是否错误?
答案 0 :(得分:0)
您必须返回一个承诺,并且由于// Within the Second Page widget
Navigator.pop(context);
使用回调,因此您必须将其包装为一个。
在您的代码中,您确实返回了一个承诺,但是您fs.readFile
也不做任何事情,因为没有什么可以等待的。您的控制台日志记录了数据,因为它被称为异步,并且由于异步线程中发生了await
语句,因此您的函数未返回任何内容。
下面的代码应该可以工作
return
正如@ jfriend00所指出的,您还可以使用node >= 10附带的基于承诺的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;
函数。
readFile
答案 1 :(得分:-1)
您的getMoviesData()
函数需要返回一个在完成文件操作后已解决的承诺。现在,它会返回一个承诺(因为它被声明为async
),该承诺会在文件操作完成之前立即得到解决。
由于nodejs已经内置了对文件操作的Promise支持,所以我建议这种实现:
const fsp = require('fs').promises;
const fileName = './utils/readme.txt'
const getMoviesData = () => {
return fsp.readFile(fileName, 'utf8');
}
module.exports = getMoviesData
通过这种方式,getMoviesData()
返回的承诺将直接与文件读取操作完成时绑定在一起,并且任何错误都直接与拒绝该承诺相关联。