node.js - 收集单个路由调用上的多个函数输出并在 NodeJS 中渲染为 html

标签 node.js express

nodejs新手,尝试使用nodejs、express和mysql作为后端执行多个函数输出到html。需要在单个路由调用上执行20个函数,以合并20个函数的输出并渲染为json到html。

我的app.js函数

    var express = require('express');
        var router = express.Router();
        var path        = require('path');
        var app = express();
        var todo = require('./modules/first');
        var todo1 = require('./modules/second');
        var connection = require('./connection');
        connection.init();
        app.get('/', function(req,res,next) {        
    Promise.all([todo.class1.getUsrCnt(),todo.class1.getTotlAmt(),todo.class1.getTotlOrdrCnt(),todo.class1.getTotlCntRcds(),todo.class1.getTotlScsRcds(),todo.class1.getTotlFailRcds(),todo.class1.getTotlAmtRcds()])
                   .then(function(allData) {
              res.addHeader("Access-Control-Allow-Origin", "http://hostname:8183/");
        res.json({ message3: allData });
        });
      res.send(send response to html);
    })
app.get('/second', function(req,res,next) {        
    Promise.all([todo1.class2.getUsr........])
                   .then(function(allData) {
              res.addHeader("Access-Control-Allow-Origin", "http://hostname:8183/");
        res.json({ message3: allData });
        });
      res.send(send response to html);
    })
    var server  = app.listen(8183, function(){
      console.log('Server listening on port '+ server.address().port) 
    });

我的todo.js是

    var connection = require('../connection');
    var data = {},obj={};
    var d = new Date();
    var month = d.getMonth() + 1;
    var year = d.getFullYear();

    obj.getUsrCnt = function getUsrCnt(callback) {
            connection.acquire(function(err, con) {
                con.query(query1, function(err, result) {
                  con.release();
                  data.usrs_cnt = result[0].some;
                })
            });
        }
    obj.getTotlAmt =  function getTotlAmt(callback) {
            connection.acquire(function(err, con) {
                con.query(query2, function(err, result) {
                    con.release();
                    data.total_amt = result[0].some1;
                })
            });
        }

    obj.getTotlOrdrCnt = function getTotlOrdrCnt(callback) {
            connection.acquire(function(err, con) {
                con.query(query3, function(err, result) {
                    con.release();
                    data.total_orders = result[0].some2;
                })
            });
        }
        .
        .
        . functions go on
exports.class1 = obj;

在 Promise all 中未定义,无法渲染到 html 文件。

最佳答案

不确定您编写的代码,但据我了解您想调用所有函数,获取所有结果并返回给用户?

因此您可以使用许多等待多个调用的库,例如基于 promise 的库:

 Promise.all([todo.getUsrCnt('dontcare'), todo.getTotlAmt('dontcate')])
    .then(function(allData) {
        // All data available here in the order it was called.
    });

对于更新后的代码,您不会按照 promise 返回数据,而是将其分配给局部变量。

你的方法应该是这样的:

 obj.getUsrCnt = function getUsrCnt(callback) {
        var promise = new Promise(function(resolve, reject) {
             connection.acquire(function(err, con) {
                    if(err) {
                        return reject(err);
                    }
                    con.query(query1, function(err, result) {
                        con.release();
                        resolve(result[0].some);
                     })
                 });
        });
        return promise;

    }

正如您在这里所看到的,我正在创建一个新的 Promise 并在主函数中返回它。 在新的 promise 中,我有两种方法:“解决”,“拒绝” 一种用于数据,一种用于错误。

所以当你像这样使用 promise 时:

returnedPromise.then(function(data) {
    //this data is what we got from resolve
}).catch(function(err) {
    //this err is what we got from reject
}); 

您可以看到 promise 可以或已解决或已拒绝, 对所有方法执行此操作,然后您开始看到数据

关于node.js - 收集单个路由调用上的多个函数输出并在 NodeJS 中渲染为 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41479114/

相关文章:

node.js - NodeJS,绕过linux主机文件

node.js - Socket.io 失败 : WebSocket is closed before the connection is established

javascript - Bluebird .finally 不是函数 node.js 错误

asynchronous - 尝试使用 async.concat 从 redis 检索数据时出错

javascript - Node.js:使用下划线和 ejs 来呈现 html

javascript - 如何修复 router.get 中相互依赖的两个 Knex MySQL 查询

ruby - 从 Node.js 生成 Ruby - 如何在 Ruby 文件中进行 require?

android - Cordova 应用程序对本地主机的 ajax 调用失败。::ERR_CONNECTION_REFUSED

javascript - 如何将逻辑分解为 Node 中的 Controller 和模型

javascript - 如何在 Express 中使用 jsTree