我试图检查给定的路径是文件夹还是文件。我必须进行异步操作,并在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
的函数关键字,它允许您使用await
thePromise值,就好像它是同步的一样。您可以将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承诺:简介