繁体   English   中英

从模块导入异步 function

[英]import async function from the module

我有一个看起来像这样的 function

let fileCache = {};
async function generateFromFile(fullPath) {
    if (!fileCache[fullPath]) {
        let jsonResource = await fs.readFile(fullPath);
        fileCache[fullPath] = JSON.parse(jsonResource);
    }
    return fileCache[fullPath];
}

当我像这样在同一个模块中使用它时

await generateFromFile('myfile.json');

它工作正常。

我创建了一个单独的文件,将 function 放在那里并像这样导出

let fileCache = {};
async function generateFromFile(fullPath) {
    if (!fileCache[fullPath]) {
        let jsonResource = await fs.readFile(fullPath);
        fileCache[fullPath] = JSON.parse(jsonResource);
    }
    return fileCache[fullPath];
}

module.exports = {
    generateFromFile: generateFromFile
}

我是这样导入的

const utils = require('../util/utils.js');

并想像await utils.generateFromFile('myfile.json');一样使用但它失败并出现错误

TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received undefined

问题是什么?

你是如何导入你的 fs 模块的。 要将readFileawait一起使用,您应该编写fs.promise.readFile或 import fs as import { promises as fs } from 'fs'

您确定您新创建的文件位于相对目录../util/utils.js吗? 你的出口看起来不错。 也许尝试打印出导入的实用程序utils以查看您实际导入的内容。

编辑:您还将相对文件名传递给您的 function 现在位于与以前不同的目录中。 访问fs.readFile(fullPath)时,它会尝试读取目录“util/”中的文件。 您应该使用路径节点 package调用您的 function 和完整的文件路径,如util.generateFromFile(path.join(__dirname, "myfile.json"))

编辑 2:像 Raeesaa state 一样,您使用 fs.readFile 错误。 它不返回 Promise 但期望回调。 await它,您必须像这样 承诺它:

const fs = require("fs");
const { promisify } = require("util");
const readFileAsync = promisify(fs.readFile);

let fileCache = {};
async function generateFromFile(fullPath) {
    if (!fileCache[fullPath]) {
        let jsonResource = await readFileAsync(fullPath);
        fileCache[fullPath] = JSON.parse(jsonResource);
    }
    return fileCache[fullPath];
}

module.exports = {
    generateFromFile: generateFromFile
}

编辑 3:如果您只导入 JSON 文件,您可以使用require来完成。 在内部,require 也有一个缓存,所以导入只执行一次。 您可以将 JSON 文件作为对象导入,如下所示: const obj = require("myfile.json");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM