【问题标题】:node.js ejs - Don't render file if it does not existnode.js ejs - 如果文件不存在,则不渲染文件
【发布时间】:2020-05-29 15:52:48
【问题描述】:

我有一个views文件夹结构和一个像这样的ejs文件profile_60113.ejs

views
    docs
        profile_60113.ejs

我可以像这样动态渲染文件(其中 data.groupID == 60113):

<%- include("docs/profile_" + data.groupID); %>

但是如何首先检查文件是否存在?我试过这个:

<% if (fs.existsSync("views/docs/profile_" + data.groupID)) { %>
    <%- include("docs/profile_" + data.groupID); %>
<% } %>

或者...

<% if (fs.existsSync("docs/profile_" + data.groupID)) { %>
    <%- include("docs/profile_" + data.groupID); %>
<% } %>

但是没有用... const fs = require('fs') 包含在控制器中并渲染 fs:fs

【问题讨论】:

  • 您不能只检查控制器中该文件的存在吗?它必须在 ejs 文件中吗?
  • ...是的,您是对的...最初并没有想到这一点。谢谢!
  • 你真的不应该在服务器中使用fs.existsSync()。它会破坏你的可扩展性,因为它会阻塞一个 Javascript 线程。您可以在调用 res.render() 之前使用异步 I/O 测试是否存在并将布尔值传递给模板,模板可以使用该布尔值。
  • @jfriend00 ...感谢您的提示! ...我做了相应的调整!

标签: javascript node.js express ejs


【解决方案1】:

有效的是例如:

选项 1(同步):模板

服务器端:

const fs = require('fs');

var getGroupID = 60113;

res.render('docs', {
   page: setPage,
   data: {groupID: getGroupID},
   fs: fs   
});  

模板:

<% if (fs.existsSync("views/docs/profile_" + data.groupID + ".ejs")) { %>
    <%- include("docs/profile_" + data.groupID); %>
<% } %>

选项 2(同步):服务器端和模板

服务器端:

const fs = require('fs');

var getGroupID = 60113;

var getProfile;
if (fs.existsSync("views/docs/profile_" + getGroupID + ".ejs")) {
  getProfile = true;
} else {
  getProfile = false;
}

res.render('docs', {
   page: setPage,
   data: {groupID: getGroupID},
   profile: getProfile   
});       

模板:

<% if (profile) { %>
    <%- include("docs/profile_" + data.groupID); %>
<% } %> 

选项 3(异步 I/O):服务器端和模板

服务器端:

...

var getProfile;
try {
  await fs.promises.access("views/docs/profile_" + getGroupID + ".ejs");
  getProfile = true;
} catch (error) {
  console.log(error);
}   

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2018-02-12
    相关资源
    最近更新 更多