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

新手到nodejs,试图执行多个函数输出到html使用nodejs,expression式和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; 

在承诺中获取未定义,并无法呈现到HTML文件。

不知道你写的代码,但据我所知你想调用所有的function,得到所有的结果,并返回给用户?

所以你可以使用很多等待几个呼叫的库,例如promise:

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

至于你的更新的代码,你不是作为承诺返回数据,你把它分配给本地variables。

这是你的方法应该看起来如何:

  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; } 

正如你在这里看到的那样,我正在创造一个新的承诺,并把它放回主要的function。 在新的承诺里面,我有两种方法:“解决”,“拒绝”一个是数据,一个是错误。

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

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

你可以看到,一个承诺可以或解决或拒绝,做到这一点的所有方法,然后你开始看到数据