未在节点 promise.each 中处理的最后一个数组元素的结果
Result for last element of the array not processed in Node promise.each
我有一段代码 运行 通过数组中的元素列表(准确地说是 mysql 主机),任务是遍历数组中的每个元素 - 连接到mysql 使用元素(主机名),运行 对其进行查询并将结果放在 json.
中
最后一个元素的结果没有被捕获到最终数组中,而其他元素是。
下面是配置数组和代码片段
配置:
config.mysql.list = ['host1', 'host2', 'host3' , 'host1'];
主机名可以重复。响应中结果对象的数量应等于数组中元素的数量。
const config = require('../../config.js');
//For RESTful API
const express = require('express');
const router = express.Router();
const promise=require('bluebird');
//For MySQL connection
const mysql = require('mysql');
promise.promisifyAll(config);
promise.promisifyAll(require('mysql/lib/Connection').prototype);
promise.promisifyAll(require('mysql/lib/Pool').prototype);
//Home page venue type wise breakup
router.get('/databaseRecords',function(req,res){
// Some vars
let arrStatus =[];
// Build the connection
function getConnection(serverHost){
// Setup the MySQL connection
let connection = mysql.createConnection({
host : serverHost,
user : config.mysql.user,
password : config.mysql.password,
database : config.mysql.database
});
// <- note the second return
return connection.connectAsync().return(connection);
}
promise.each(config.mysql.list,function(serverHost) {
//Create connection
return getConnection(serverHost).then(function(conn){
// Slave status
let qry = 'SELECT * FROM tableName limit 1';
// Response ?
conn.queryAsync(qry).then(function(rows){
let strresponse = JSON.stringify(rows);
let jsonresponse = JSON.parse(strresponse);
jsonresponse[0].whichRec=serverHost;
arrStatus.push(jsonresponse[0]);
//done
conn.endAsync();
});
});
}).then(function(){
// Emit the response
res.json({'data':arrStatus});
}).catch(function(err){
let respErr = JSON.parse(err.error);
res.json({'Error':respErr});
});
});
//Export routes
module.exports = router;
对于我在代码片段中真正缺少的东西有点困惑。
把return放在conn.queryAsync(qry)前面。您需要 return return 来自 conn.queryAsync 的承诺。希望这有帮助。
我有一段代码 运行 通过数组中的元素列表(准确地说是 mysql 主机),任务是遍历数组中的每个元素 - 连接到mysql 使用元素(主机名),运行 对其进行查询并将结果放在 json.
中最后一个元素的结果没有被捕获到最终数组中,而其他元素是。
下面是配置数组和代码片段
配置:
config.mysql.list = ['host1', 'host2', 'host3' , 'host1'];
主机名可以重复。响应中结果对象的数量应等于数组中元素的数量。
const config = require('../../config.js');
//For RESTful API
const express = require('express');
const router = express.Router();
const promise=require('bluebird');
//For MySQL connection
const mysql = require('mysql');
promise.promisifyAll(config);
promise.promisifyAll(require('mysql/lib/Connection').prototype);
promise.promisifyAll(require('mysql/lib/Pool').prototype);
//Home page venue type wise breakup
router.get('/databaseRecords',function(req,res){
// Some vars
let arrStatus =[];
// Build the connection
function getConnection(serverHost){
// Setup the MySQL connection
let connection = mysql.createConnection({
host : serverHost,
user : config.mysql.user,
password : config.mysql.password,
database : config.mysql.database
});
// <- note the second return
return connection.connectAsync().return(connection);
}
promise.each(config.mysql.list,function(serverHost) {
//Create connection
return getConnection(serverHost).then(function(conn){
// Slave status
let qry = 'SELECT * FROM tableName limit 1';
// Response ?
conn.queryAsync(qry).then(function(rows){
let strresponse = JSON.stringify(rows);
let jsonresponse = JSON.parse(strresponse);
jsonresponse[0].whichRec=serverHost;
arrStatus.push(jsonresponse[0]);
//done
conn.endAsync();
});
});
}).then(function(){
// Emit the response
res.json({'data':arrStatus});
}).catch(function(err){
let respErr = JSON.parse(err.error);
res.json({'Error':respErr});
});
});
//Export routes
module.exports = router;
对于我在代码片段中真正缺少的东西有点困惑。
把return放在conn.queryAsync(qry)前面。您需要 return return 来自 conn.queryAsync 的承诺。希望这有帮助。