Nodejs有没有支持异步查询的模板?

Nodejs有没有支持异步查询的模板?

nodejs有没有支持异步查询的模板? nodejs有没有支持异步查询的模板? 例如:可以在模板里这样写, User.find(id,function(){ //… });

或者 var userlist = User.findAll()

5 回复

当然有支持异步查询的模板引擎。在 Node.js 中,有许多模板引擎可以选择,如 Pug、EJS 和 Nunjucks 等。这些模板引擎不仅支持同步操作,还可以很好地与异步代码集成。

示例:使用 EJS 模板引擎

假设我们有一个简单的 Express 应用程序,并且我们想在模板中执行异步操作来查询数据库(以 Mongoose 为例)。

安装依赖

首先,确保你已经安装了 expressmongooseejs

npm install express mongoose ejs

设置 Express 应用

创建一个基本的 Express 应用来设置路由:

const express = require('express');
const mongoose = require('mongoose');

const app = express();

// 连接 MongoDB
mongoose.connect('mongodb://localhost:27017/testdb', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

// 定义用户模型
const UserSchema = new mongoose.Schema({
    name: String,
    email: String
});
const User = mongoose.model('User', UserSchema);

app.set('view engine', 'ejs');

app.get('/', async (req, res) => {
    try {
        const users = await User.find({});
        res.render('index', { users });
    } catch (err) {
        res.status(500).send(err.message);
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

创建 EJS 模板

在项目目录中创建一个 views 文件夹,并在其中创建一个 index.ejs 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>User List</title>
</head>
<body>
    <h1>User List</h1>
    <ul>
        <% users.forEach(function(user) { %>
            <li><%= user.name %> - <%= user.email %></li>
        <% }) %>
    </ul>
</body>
</html>

解释

  1. Express 应用:我们设置了一个简单的 Express 应用,连接到 MongoDB 数据库,并定义了一个 User 模型。
  2. 路由:我们在根路径 / 上设置了一个路由处理器,它会异步地查询所有用户并将其传递给 index.ejs 模板。
  3. EJS 模板:在模板中,我们使用 <% %> 来包裹 JavaScript 代码,并使用 <%= %> 来输出数据。

这种方式允许你在模板中处理异步操作,使你的代码更加简洁和可维护。


这个放到业务逻辑里处理不行么,获取完数据再渲染

这些查询逻辑是不应该出现在模板里的。 楼主是什么特殊场景?

Node.js 中可以使用一些模板引擎来实现异步查询。一个常见的选择是使用 EJS(Embedded JavaScript)结合 Express 框架来处理异步操作。EJS 本身不直接支持异步查询,但你可以通过在后端处理这些异步操作并将结果传递给模板。

以下是一个简单的示例,展示如何在 Node.js 中使用 EJS 和 Express 来实现异步查询:

示例代码

  1. 安装依赖

    npm install express ejs mongoose
    
  2. 创建服务器文件 server.js

    const express = require('express');
    const ejs = require('ejs');
    const mongoose = require('mongoose');
    
    const app = express();
    app.set('view engine', 'ejs');
    
    // 连接到 MongoDB
    mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });
    
    // 定义用户模型
    const UserSchema = new mongoose.Schema({
      name: String,
      email: String
    });
    const User = mongoose.model('User', UserSchema);
    
    // 路由处理异步查询
    app.get('/', async (req, res) => {
      try {
        const users = await User.find({});
        res.render('index', { users });
      } catch (error) {
        res.status(500).send('Error fetching users');
      }
    });
    
    app.listen(3000, () => {
      console.log('Server is running on port 3000');
    });
    
  3. 创建 EJS 模板 views/index.ejs

    <!DOCTYPE html>
    <html>
    <head>
      <title>User List</title>
    </head>
    <body>
      <h1>User List</h1>
      <ul>
        <% users.forEach(function(user) { %>
          <li><%= user.name %> - <%= user.email %></li>
        <% }) %>
      </ul>
    </body>
    </html>
    

解释

  • Express 是一个用于构建 Web 应用程序的框架。
  • EJS 是一个模板引擎,允许你在 HTML 文件中嵌入 JavaScript 代码。
  • Mongoose 是一个对象数据建模(ODM)库,它让操作 MongoDB 变得更加简单。
  • server.js 中,我们定义了一个用户模型并连接到 MongoDB。
  • 使用 app.get('/', async (req, res) => { ... }) 定义了一个路由,该路由执行异步查询并将其结果传递给 index.ejs 模板。
  • index.ejs 模板遍历传递过来的用户列表并显示每个用户的姓名和电子邮件。

通过这种方式,你可以在 Node.js 中实现异步查询,并将查询结果渲染到模板中。

回到顶部