FS readFile在获取请求中不返回任何内容

时间:2020-11-05 21:08:36

标签: node.js express fs

每当有人向我的服务器发出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)
})

我不明白为什么会这样?我的异步/等待语法是否错误?

2 个答案:

答案 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()返回的承诺将直接与文件读取操作完成时绑定在一起,并且任何错误都直接与拒绝该承诺相关联。

相关问题