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/