Nodejs中,一个app.get里,怎么才能把数据中不同的两个集合输出到页面上?

Nodejs中,一个app.get里,怎么才能把数据中不同的两个集合输出到页面上?

app.get(’/test’,function(req, res){ category.getTen(function (err, posts) { res.render(‘test’, { //title: ‘分类管理’, posts: posts, user: req.session.user, success: req.flash(‘success’).toString(), error: req.flash(‘error’).toString() }); }) category.getCat(function (err, pers) { res.render(‘test’, { title: ‘分类管理’, pers: pers, user: req.session.user, success: req.flash(‘success’).toString(), error: req.flash(‘error’).toString() }); })

});

代码如上,两个方法分别加载两个集合的数据,如果单独写没问题,但两个写在一起,就碰到问题了,求解决指导。


6 回复

在Node.js的Express框架中,如果你想在一个app.get路由处理函数中同时获取并渲染两个不同的数据集,你需要确保这两个异步操作都完成后再进行渲染。这可以通过使用回调函数或Promise来实现。

示例代码

const express = require('express');
const category = require('./models/category'); // 假设这是你的模型文件

const app = express();

app.get('/test', function(req, res) {
    Promise.all([
        new Promise((resolve, reject) => {
            category.getTen(function(err, posts) {
                if (err) return reject(err);
                resolve(posts);
            });
        }),
        new Promise((resolve, reject) => {
            category.getCat(function(err, pers) {
                if (err) return reject(err);
                resolve(pers);
            });
        })
    ]).then(([posts, pers]) => {
        res.render('test', {
            title: '分类管理',
            posts: posts,
            pers: pers,
            user: req.session.user,
            success: req.flash('success').toString(),
            error: req.flash('error').toString()
        });
    }).catch(err => {
        console.error(err);
        res.status(500).send('服务器错误');
    });
});

module.exports = app;

解释

  1. 使用Promise.all

    • Promise.all允许你同时执行多个异步操作,并等待它们全部完成。它接收一个包含多个Promise的数组作为参数。
  2. 封装异步操作为Promise

    • 在这里,我们将category.getTencategory.getCat方法封装为Promise。这样我们可以用.then()来处理成功的情况,用.catch()来处理失败的情况。
  3. 解构赋值

    • .then()的回调函数中,我们使用解构赋值([posts, pers])来直接从Promise的结果中提取postspers
  4. 错误处理

    • 如果任一异步操作失败,.catch()将捕获错误,并返回一个500状态码给客户端。

通过这种方式,你可以确保在渲染视图之前,所有的数据都已经准备好。


你这种情况用async.parallel就行

Q也可以。

  1. 代码中无法 res.render 两次。根据你的代码,两个 res.render 随机一个执行,另一个无效。

  2. 应该先获取 ten 和 cat,等两样都获取时,再一起 render。

  3. 如果用串行思维,那么把下面那句 getCat 嵌套在 getTen 里面就好了。

  4. 如果并行,可以去试试 async 或者 eventproxy。我个人喜欢后者。

谢谢,我使用你说的async方法, app.get(’/test’,function(req, res){ category.getCat(function (err, results) { res.render(‘test’, { title: ‘分类管理’, pers: results.one, posts: results.two, user: req.session.user, success: req.flash(‘success’).toString(), error: req.flash(‘error’).toString() }); })

});

后面是这样的,

var date = {}; async.parallel({ one: function(callback) { setTimeout(function(){ PersonModel.find(function(err,persons){ console.log(“1”); //console.log(persons); callback(null, persons); }); },100); },

two: function(callback) { setTimeout(function(){ PostModel.find({“title”:“aa”},function(err,posts){ console.log(“2”); //console.log(posts); callback(null, posts); }); },200); } }, function(err,results){ //return results; //callback(null, results); //console.log(results); date = results; }) console.log(date); category.getCat = function(callback) { console.log(“2”+date); callback(null, date); }

如果你觉得我的代码有改进或者优化的地方,请不吝指出,谢谢

恩,你解释的很到位,你说的第二种方法我尝试过,但未能成功(而且这种方法应该不是很提倡吧)。第三种也试过,貌似也没成功。然后用了你指的第四种方法,成功了。谢谢指出

在Node.js中,如果你想在一个app.get路由处理函数中同时获取两个集合的数据并将其渲染到页面上,你需要确保这两个异步操作都已完成后再调用res.render。你可以使用Promise或async/await来实现这一点。

示例代码

const express = require('express');
const category = require('./models/category'); // 假设这是你的模型

app.get('/test', async function(req, res) {
    try {
        const [posts, pers] = await Promise.all([
            category.getTen(),
            category.getCat()
        ]);

        res.render('test', {
            title: '分类管理',
            posts: posts,
            pers: pers,
            user: req.session.user,
            success: req.flash('success').toString(),
            error: req.flash('error').toString()
        });
    } catch (err) {
        console.error(err);
        res.status(500).send('服务器错误');
    }
});

解释

  1. 使用Promise.allPromise.all接收一个数组,并返回一个新的Promise。当数组中的所有Promise都成功完成时,新的Promise才会解析为这些Promise的结果数组。如果有任何一个Promise失败,则新的Promise立即失败,并带有第一个失败的错误信息。

  2. 使用async/awaitasync函数可以简化异步代码的编写。通过将Promise.all包裹在try/catch块中,我们可以更容易地处理可能发生的任何错误。

  3. 同时获取数据:通过这种方式,我们可以在一次请求中同时获取postspers的数据,并将它们一起传递给模板进行渲染。

这样,你就可以在同一个页面上显示来自两个不同集合的数据了。

回到顶部