async.parallel
功能从单个网址中的两个不同的表中获取JSON响应场景就像这样
有一个数据库
该数据库中有两个表
我正在用两个表转换来自两个表的JSON响应 请求异步
任何想法
我的快递程序::
var express = require('express')
, async = require('async')
, http = require('http')
, mysql = require('mysql');
var app = express();
var connection = mysql.createConnection({
host: 'localhost',
user: 'xxxx',
password: "xxxx",
database: 'test123'
});
connection.connect();
// all environments
app.set('port', process.env.PORT || 8084);
app.get('/',function(request,response){
var first, second;
async.series( [
// Get the first table contents
function ( callback ) {
connection.query('SELECT * FROM test1', function(err, rows, fields)
{
console.log('Connection result error '+err);
first = JSON.stringify(rows);
callback();
});
},
// Get the second table contents
function ( callback ) {
connection.query('SELECT * FROM test2', function(err, rows, fields)
{
console.log('Connection result error '+err);
second = JSON.stringify(rows);
callback();
});
}
// Send the response
], function ( error, results ) {
response.writeHead(200, { 'Content-Type': 'application/json'});
response.end({
'first' : first,
'second' : second
});
} );
} );
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
错误::
Express server listening on port 8084
Connection result error null
Connection result error null
TypeError: first argument must be a string or Buffer
at ServerResponse.OutgoingMessage.write (http.js:783:11)
at ServerResponse.OutgoingMessage.end (http.js:964:16)
at /home/ubuntu/rainmelon/sample_programs/express_folder_json/app.js:55:18
at /home/ubuntu/rainmelon/sample_programs/express_folder_json/node_modules/async/lib/async.js:229:13
at /home/ubuntu/rainmelon/sample_programs/express_folder_json/node_modules/async/lib/async.js:139:25
at /home/ubuntu/rainmelon/sample_programs/express_folder_json/node_modules/async/lib/async.js:226:17
at /home/ubuntu/rainmelon/sample_programs/express_folder_json/node_modules/async/lib/async.js:553:34
at Query._callback (/home/ubuntu/rainmelon/sample_programs/express_folder_json/app.js:48:21)
at Query.Sequence.end (/home/ubuntu/rainmelon/sample_programs/node_modules/mysql/lib/protocol/sequences/Sequence.js:66:24)
at Query._handleFinalResultPacket (/home/ubuntu/rainmelon/sample_programs/node_modules/mysql/lib/protocol/sequences/Query.js:143:8)
快递程序::
var express = require('express')
, async = require('async')
, http = require('http')
, mysql = require('mysql');
var app = express();
var connection = mysql.createConnection({
host: 'localhost',
user: 'xxx',
password: "xxx",
database: 'test123'
});
connection.connect();
// all environments
app.set('port', process.env.PORT || 8084);
app.get('/',function(request,response){
var first, second;
async.series( [
// Get the first table contents
function ( callback ) {
connection.query('SELECT * FROM test1', function(err, rows, fields)
{
console.log('Connection result error '+err);
first = JSON.stringify(rows);
callback();
});
},
// Get the second table contents
function ( callback ) {
connection.query('SELECT * FROM test2', function(err, rows, fields)
{
console.log('Connection result error '+err);
second = JSON.stringify(rows);
callback();
});
}
// Send the response
], function ( error, results ) {
response.json({
'first' : first,
'second' : second
});
} );
} );
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
答案 0 :(得分:1)
错误不在async.parallel()
。堆栈跟踪提到:
at ServerResponse.OutgoingMessage.write (http.js:783:11)
at ServerResponse.OutgoingMessage.end (http.js:964:16)
at /home/ubuntu/rainmelon/sample_programs/express_folder_json/app.js:55:18
55
的行app.js
大概是:
response.end({
问题是内置的response.end()
不支持将Object
自动序列化为JSON。它只接受String
的{{1}}或Buffer
。
您自己需要data
stringify
。
Object
或者,您可以使用Express“.send()
或.json()
。
response.end(JSON.stringify({
// ...
}));
后者中的任何一个也会为你设置// Send the response
], function ( error, results ) {
response.send({
'first' : first,
'second' : second
});
} );
。
答案 1 :(得分:0)
我认为如果仔细查看async.js文档中的示例,您会注意到保存每个结果的“first”和“second”var的范围是错误的。您应该使用各自的错误和响应调用每个回调,然后使用示例中的数组来构建要提交的最终对象。 (或者你可以使用globar var,但这不是一个好主意)。欢呼声。
async.series([
function(callback){
// do some stuff ...
callback(null, 'one');
},
function(callback){
// do some more stuff ...
callback(null, 'two');
}
],
// optional callback
function(err, results){
// results is now equal to ['one', 'two']
});