在单个路由调用上收集多个函数输出并在nodejs中呈现为html

时间:2017-01-05 07:08:19

标签: node.js express

newbie to nodejs,尝试使用nodejs执行多个函数输出到html,使用express和mysql作为后端。需要在单个路由调用上执行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中获取undefined并且无法呈现给html文件。

1 个答案:

答案 0 :(得分:1)

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

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

* Rebuilt URL to: https://git.cedware.com/
*   Trying 37.120.177.116...
* Connected to git.cedware.com (37.120.177.116) port 443 (#0)
* found 175 certificates in /etc/ssl/certs/ca-certificates.crt
* found 700 certificates in /etc/ssl/certs
* ALPN, offering http/1.1
* SSL connection using TLS1.2 / ECDHE_RSA_AES_256_GCM_SHA384
*        server certificate verification OK
*        server certificate status verification SKIPPED
*        common name: git.cedware.com (matched)
*        server certificate expiration date OK
*        server certificate activation date OK
*        certificate public key: RSA
*        certificate version: #3
*        subject: CN=git.cedware.com
*        start date: Wed, 04 Jan 2017 16:58:00 GMT
*        expire date: Tue, 04 Apr 2017 16:58:00 GMT
*        issuer: C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3
*        compression: NULL
* ALPN, server accepted to use http/1.1
> GET / HTTP/1.1
> Host: git.cedware.com
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 502 Bad Gateway
< Server: nginx/1.10.0 (Ubuntu)
< Date: Thu, 05 Jan 2017 08:45:52 GMT
< Content-Type: text/html
< Content-Length: 182
< Connection: keep-alive
<
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.10.0 (Ubuntu)</center>
</body>
</html>
* Connection #0 to host git.cedware.com left intact

对于您更新的代码,您不会将数据作为promises返回,而是将其分配给局部变量。

这是您的方法应该如何看待:

> 2017/01/05 09:47:43 [error] 26258#26258: *1 recv() failed (104:
> Connection reset by peer) while reading response header from upstream,
> client: 217.7.247.238, server: git.cedware.com, request: "GET /
> HTTP/1.1", upstream: "http://127.0.0.1:8002/", host: "git.cedware.com"
> 2017/01/05 09:47:43 [error] 26258#26258: *1 recv() failed (104:
> Connection reset by peer) while reading response header from upstream,
> client: 217.7.247.238, server: git.cedware.com, request: "GET /
> HTTP/1.1", upstream: "http://[::1]:8002/", host: "git.cedware.com"
> 2017/01/05 09:47:43 [error] 26258#26258: *1 no live upstreams while
> connecting to upstream, client: 217.7.247.238, server:
> git.cedware.com, request: "GET /favicon.ico HTTP/1.1", upstream:
> "http://localhost/favicon.ico", host: "git.cedware.com", referrer:
> "https://git.cedware.com/"

正如你在这里看到的,我正在创建一个新的promise并将其返回到main函数中。 在新承诺里面我有两种方法:“解决”,“拒绝” 一个用于数据,一个用于错误。

所以当你使用这样的承诺:

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

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