【问题标题】:FS readFile returns nothing in a get requestFS readFile 在获取请求中不返回任何内容
【发布时间】:2021-02-18 15:18:19
【问题描述】:

每当有人向我的服务器发出获取请求时,我都会尝试从 .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)
})

我不明白为什么会这样?我的 async/await 语法错了吗?

【问题讨论】:

  • 只是想确保您看到您不必手动承诺fs.readFile()。您可以使用fs.promises.readFile() 在fs 模块中使用内置的promise 支持(自v10 起在nodejs 中)。有关详细信息以及执行此操作的非常简单的方法,请参见我的答案。
  • 老实说,我不能接受你的两个答案,这让我很生气。你都是对的,两种解决方案都有效。我只是选择了第一个,因为这很公平,stackoverflow 应该可以解决这个问题。我非常感谢您的帮助。
  • 没问题。只是想确保您了解在 nodejs 中使用带有文件系统访问的 Promise 的更现代的方式。随着时间的推移,如果您获得更多声望,您就可以对所有有用的答案进行投票(仍然只有“接受”一个)。

标签: node.js express fs


【解决方案1】:

你必须返回一个承诺,因为fs.readFile 使用回调,你必须将它包装在一个中。

在您的代码中,您确实返回了一个承诺,但您没有 await 任何东西,您也没有任何东西,因为没有什么可以等待的。您的控制台日志记录了数据,因为它被称为异步并且您的函数没有返回任何内容,因为 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 附带的基于promise 的readFile 函数。

const { readFile } = require("fs/promises");
const fileName = "./utils/readme.txt";

const getMoviesData = () => {
  return readFile(fileName, "utf8");
};

module.exports = getMoviesData;

【讨论】:

  • fs.promises 自 v10 以来一直在 nodejs 中。
【解决方案2】:

你的getMoviesData() 函数需要返回一个在你的文件操作完成时被解析的promise。现在,它返回一个承诺(因为它被声明为async),在你的文件操作完成之前立即解决。

由于 nodejs 已经内置了对文件操作的承诺支持,我建议这个实现:

const fsp = require('fs').promises;
const fileName = './utils/readme.txt'

const getMoviesData = () => {
  return fsp.readFile(fileName, 'utf8');
}

module.exports = getMoviesData

这样getMoviesData() 返回的承诺直接与文件读取操作完成的时间相关联,任何错误都直接与拒绝该承诺相关联。

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2018-05-03
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多