【问题标题】:How do I return a result in a file finding function (Node.js)? [duplicate]如何在文件查找函数 (Node.js) 中返回结果? [复制]
【发布时间】:2020-03-09 20:02:24
【问题描述】:

使用 Node.js,我试图在当前目录中搜索特定文件,并在文件名末尾附加一个随机数。在网上搜索后,我发现this package 可能最适合这项工作,但我似乎无法让它发挥作用。

这是我目前所拥有的:

const find = require('find');

function func1() {
    const x = find.file(/solution[0-9]*\.json/, __dirname, function(files) {
        console.log(files[0]);
        return files[0];
    });
    console.log(x);
}

func1();

这在找到正确的文件并将其打印到控制台方面做得很好,但我仍然无法在 func1 中使用该文件的路径,而这正是我所需要的。这是我得到的结果:

{ error: [Function: error] }
C:\Users\dir1\dir2\solution78029853.json

我尝试了多种“实验性”可能的语法,但似乎都不起作用,这确实是我能得到的最接近的语法。我确实注意到{ error: [Function: error] } 显示在console.log(files[0]); 之前,但我不确定这是否是问题所在,如果是,我不知道如何防止它。没有const x =console.log(x); 我没有错误,只显示路径,所以我确定有什么问题;我只是不知道是什么。我已经在网上搜索了一个多小时,但没有任何进展,所以希望有人知道我做错了什么(可能很简单)。

在 Bergur 发表评论后编辑 func1():

function func1() {
    const x = find.file(/solution[0-9]*\.json/, __dirname, function(files) {
        console.log(files[0]);
        return files[0];
    })
    .error(function(err) {
        if (err) {
            //
        }
    });
    console.log(x);
}

这不会产生错误,而只是打印 undefined 而不是 console.log(x);

【问题讨论】:

  • 您是否尝试过使用 .error 来查看您遇到了什么错误?:getting:npmjs.com/package/find#errorcallback
  • 我是 JavaScript 的新手,这并没有真正的帮助。我不知道该怎么做,所以我用我将问题添加到我的代码中的方式编辑了这个问题......
  • 没问题,我们都必须从某个地方开始。只是其中的console.log(err),希望它能给你一些东西。
  • 相信你会遇到这个经典:stackoverflow.com/questions/14220321/…

标签: javascript node.js function return


【解决方案1】:

这 100% 有效

//Try this
const util = require('util'); //https://nodejs.org/api/util.html
const findFileAsync = util.promisify(find.file);
const func1 = async () => {
  try{
    const results = await findFileAsync(/solution[0-9]*\.json/, __dirname);
    console.log(results[0]);
  } catch(err){
    console.log(err);
  }
}
func1();

【讨论】:

  • 我选择了另一个答案,因为它与我已有的代码更相似,但感谢您抽出宝贵时间回答!
  • 不要忘记在异步函数中使用 try/catch 块。
【解决方案2】:

函数find.file 是异步的,这意味着您将在回调中获得结果(该函数的第三个参数)。 假设您使用的是 ES6 并希望避免回调地狱问题,您可以像这样使用 async 和 await:

const find = require('find');

async function findFile(name, path) {
  return new Promise(function (ok, fail) {
    find.file(name, path, function(files) {
        ok(files.find(_ => true)) // resolve promise and return the first element
    });
  });
}

async function func1() {
    const x = await findFile(/testFile[0-9]/, "files")
    console.log(`Path to my file: ${x}`);
}

func1();

链接:https://repl.it/repls/ZestyJauntyApplicationserver

【讨论】:

    【解决方案3】:

    console.log(x) 不在func1() 函数内

    如果要检查 x 的值,请在 func1 函数内添加 return 语句,然后 console.log(func1())

    【讨论】:

    • 感谢您指出这一点,我编辑了这个问题,所以它现在正确地代表了我到目前为止的代码。然而,在实际代码中,console.log(x)func1() 函数内,因此这也应该可以检查 x... 的值...(对吗?)
    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多