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 的承诺直接与文件读取操作完成的时间相关联,任何错误都直接与拒绝该承诺相关联。