如何从函数返回fs.lstat方法的结果



我试图检查给定的路径是文件夹还是文件。我必须进行异步操作,并在pug文件上显示结果,而不是在控制台上。

const fs = require("fs");
module.exports = function (path) {
fs.lstat(path, (err, stats) => {
if(err)
return console.log(err);
if (stats.isFile())
return(`Is file: ${stats.isFile()}`);
if (stats.isDirectory())
return(`Is directory: ${stats.isDirectory()}`);
}); 

}

3种将回调呈现到pug布局的方法

有两种方法可以从异步函数返回值,即回调或承诺,但老实说,如果你只使用一次通话,就不会与在路由中内联对fs.lstat的调用完全不同,所以我将提供作为第三种选择。

示例的目录结构

如果你想继续,这里是这个例子的目录结构。

.
├── app.js
├── stat.js
└── views
└── index.pug
1 directory, 3 files

正在安装依赖项

您将想要为这个示例安装express和pug

npm install pug express

布局示例

首先,这里有一个示例布局./views/index.pug,我们将用于演示目的:

html
head
//- This title comes from the express res.render 
title= title
body
//- This title comes from the express res.render 
h1= title
//- This message comes from the express res.render 
p= statResult

示例1:回调

这是一个可能使用回调的目录/文件报告功能。回调基本上就是您已经发送到fs.lstat的内容只需通过包装对其输出进行简单更改它在我们自己的名为cb的节点样式回调中。节点样式回调通常具有两个参数,误差作为第一参数,数据作为第二参数。我们将遵循节点样式的回调模式。用我们自己的回调包装fs.lstat只允许调用我们函数的函数获取我们想要的返回值,而不是所有信息fs.lstat可能会提供其他信息。

我们把这个函数放在一个名为stat.js的文件中,作为示例。除非您知道如何处理stat.js中的错误最好通过回调传递错误,以防调用函数可以更好地处理错误。重要的是不要吞下/丢失Node中的错误。

// stat.js
const fs = require("fs");
module.exports = function (path, cb) {
fs.lstat(path, (err, stats) => {
if (err)
return cb(err);
if (stats.isFile())
return cb(null, `Is file: ${stats.isFile()}`);
if (stats.isDirectory())
return cb(null, `Is directory: ${stats.isDirectory()}`);
});
}

回调函数的使用

以下是一个简单的express应用程序如何使用此回调。我们会将其放入一个名为app.js的脚本文件中,以供示例使用。注意我们如何将"视图引擎"设置为"pug"res.render视图目录中的"index.pug"。

// app.js
const express = require('express');
const app = express();
const stat = require('./stat.js');
const port = 3020;
app.set('view engine', 'pug');
app.get('/views', function (req, res) {
stat("./views", (err, statResult) => {
if (err) {
res.render("Oops something went wrong!");
console.error(err);
}
res.render('index', {
title: "Views Directory Stat Result",
statResult: statResult
})
})
})
app.get('/', function (req, res) {
stat("./app.js", (err, statResult) => {
if (err) {
res.render("Oops something went wrong!");
console.error(err);
}
res.render('index', {
title: "App.js Stat Result",
statResult: statResult
})
});
})

app.listen(port, function () {
console.log("app listening on http://localhost:" + port)
})

示例2:承诺

承诺是一个非常方便的异步代码工具,如果你了解它们足够好,可以在错误处理方面得到巨大改进。

以下是使用promise的自定义stat示例代码。注意它是如何返回新建的promise这很重要,因为承诺是代表最有可能实现的价值的价值观在未来的某个时间。Promises构造函数为您提供解析和拒绝功能。这是因为承诺可以是三个州之一,"待定"意味着尚未最终确定其状态或"已解决"或"已拒绝"。以错误拒绝承诺是善意的就像在同步代码中抛出错误一样。这是我们旧stat.js的替代品文件

// stat.js
const fs = require("fs");
module.exports = function (path) {
return new Promise((resolve, reject) => {
fs.lstat(path, (err, stats) => {
if (err)
return reject(err);
if (stats.isFile())
return resolve(`Is file: ${stats.isFile()}`);
if (stats.isDirectory())
return resolve(`Is directory: ${stats.isDirectory()}`);
});
})
}

以下是如何在一个简单的应用程序中使用stat.js文件。需要注意的一点是,您必须将.then链接到一个承诺它们的价值,如果它们得到解决,如果你想抓住任何被拒绝的承诺您需要使用.catch来捕捉它们。就像在遇到错误时使用同步代码一样它假定您已经处理了错误,除非您重新抛出它。关于承诺,有很多事情需要了解,我不会面面俱到为了简洁起见,但我将在底部链接一些文章,您可以在其中了解更多信息。

尽管链接的替代方法是使用async/await在函数前面使用关键字为async的函数关键字,它允许您使用awaitthePromise值,就好像它是同步的一样。您可以将await视为从承诺中打开价值。以下是promise实现中的新app.js,路由/views执行链接api路由CCD_ 15进行异步/等待api:

// app.js
const express = require('express');
const app = express();
const stat = require('./stat2.js');
const port = 3020;
app.set('view engine', 'pug');
app.get('/views', function (req, res) {
stat("./views").then(statResult => {
res.render('index', {
title: "Views Directory Stat Result",
statResult: statResult
})
}).catch(function (err) {
res.render("Oops something went wrong!");
console.error(err);
})
})
app.get('/', async function (req, res) {
try {
const statResult = await stat("./app.js");
res.render('index', {
title: "App.js Stat Result",
statResult: statResult
})
} catch (err) {
res.render("Oops something went wrong!");
console.error(err);
}
})

app.listen(port, function () {
console.log("app listening on http://localhost:" + port)
})

示例3:插入对lstat的调用

如果你不想重复自己,这可能不是你想做的,但是内联您对lstat的调用始终是一种选择。因此,你只会有一个app.js文件,它看起来像这样:

// app.js
const express = require('express');
const app = express();
const fs = require('fs');
const port = 3020;
app.set('view engine', 'pug');
app.get('/views', function (req, res) {
fs.lstat("./views", (err, stats) => {
if (err) {
res.render("Oops something went wrong!");
console.error(err);
}
let statResult = "";
if (stats.isFile())
statResult = `Is file: ${stats.isFile()}`;
if (stats.isDirectory())
statResult = `Is directory: ${stats.isDirectory()}`;
res.render('index', {
title: "Views Directory Stat Result",
statResult: statResult
})
});
})
app.get('/', function (req, res) {
fs.lstat("./app.js", (err, stats) => {
if (err) {
res.render("Oops something went wrong!");
console.error(err);
}
let statResult = "";
if (stats.isFile())
statResult = `Is file: ${stats.isFile()}`;
if (stats.isDirectory())
statResult = `Is directory: ${stats.isDirectory()}`;
res.render('index', {
title: "App.js Stat Result",
statResult: statResult
})
});
})

app.listen(port, function () {
console.log("app listening on http://localhost:" + port)
})

这就是返回异步值的仅有的三种方法用pug渲染。希望有帮助,请随时问我您对此代码有任何疑问,请在评论中提出。我真诚地建议你要善于做出承诺在调用时只有一个返回值。

以下是一些承诺参考:

MDN使用Promises

Jake Archibald的JavaScript承诺:简介

相关内容

最新更新