Node JS异步响应
Node JS Async Response
我用MongoDB在Node.js中编写了我的第一个应用程序,我遇到了我需要根据IF/ELSE条件拥有2个db.collection.update
语句的情况。我试图返回resJSON
JS对象中的操作细节,但似乎回调正在执行db.collection.update
语句完成之前,resJSON
的默认值每次都在响应中返回。
详细代码:
var url = require('url');
var fs = require('fs');
var async = require('async');
var passwordGen = require('../../lib/passwordGen');
var http = require("http");
var server = http.createServer();
server.on('request', request);
server.listen(8080,'127.0.0.1');
function request(request, response) {
var userData = '';
request.on('data', function(data)
{
userData += data;
});
request.on('end', function()
{
async.auto({
allProcess: function(callback){
var resJSON = {'inserted':0,'disabled':0,'error':''};
var jsonData = JSON.parse(userData);
if(jsonData.length > 0){
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:27017/test_db", function(err,db){
if(err) { return console.dir(err); }
var collection = db.collection('users');
var arrDisableRec = [];
for(i=0;i<jsonData.length;i++){
var action = jsonData[i]['action'].toLowerCase();
if(action == 'disable'){
arrDisableRec.push(jsonData[i]['email']);
}else{
var date = new Date();
var obj = {
'createdISO':date,
'created':date,
'updated':date,
'updatedISO':date,
'email':jsonData[i]['email'],
'firstName':jsonData[i]['firstname'],
'lastName':jsonData[i]['lastname'],
'password':passwordGen.getPassword(),
'enabled':true,
'active':true,
'downloaded':true,
'defaultServings':2,
'name':''
};
collection.update(
{'email':jsonData[i]['email']},
{$setOnInsert:obj},
{upsert: true},
function(err,numberAffected,rawResponse) {
if(typeof numberAffected.result.upserted != 'undefined'){
resJSON['inserted'] = resJSON['inserted'] + numberAffected.result.upserted.length;
}
if(typeof numberAffected.result.nModified != 'undefined'){
resJSON['disabled'] = resJSON['disabled'] + parseInt(numberAffected.result.nModified);
}
if(typeof numberAffected.result.writeError != 'undefined'){
resJSON['error'] ='Error Code:'+(numberAffected.result.writeError.code)+', '+numberAffected.result.writeError.errmsg;
}
console.log(resJSON); //shows correct values
}
);
}
if(arrDisableRec.length > 0){
collection.update(
{'email':{$in:arrDisableRec}},
{$set:{'enabled':false}},
{multi:true},
function(err,numberAffected,rawResponse) {
if(typeof numberAffected.result.upserted != 'undefined'){
resJSON['inserted'] = resJSON['inserted'] + numberAffected.result.upserted.length;
}
if(typeof numberAffected.result.nModified != 'undefined'){
resJSON['disabled'] = resJSON['disabled'] + parseInt(numberAffected.result.nModified);
}
if(typeof numberAffected.result.writeError != 'undefined'){
resJSON['error'] ='Error Code:'+(numberAffected.result.writeError.code)+', '+numberAffected.result.writeError.errmsg;
}
console.log(resJSON); //shows correct values
}
);
}
}
});
}
callback(resJSON);
}
},function(resJSON){
response.writeHead(200,{
'Content-Type': 'text/json'
});
response.end(JSON.stringify(resJSON)); //replies back with default resJSON only.
});
});
}
有什么建议/指示吗?
谢谢
你必须在回调链的最后调用回调。
例如console.log(resJSON); //shows correct values
callback(null, resJSON);
您必须确保每个回调链端点都调用回调。要处理for循环,你必须有一种机制来连接for循环内所有异步调用的所有端点。
例如if(err) {
return callback(err);
}
注意我使用了function callback(err, res)
标准节点原型而不是你的function callback(res)
更好的是,使用像async
这样的异步流库或像bluebird
这样的承诺库
这是针对您的问题的反向解决方案。这应该能暂时解决你的案子。尝试阅读异步库。这对以后会很有用。
var counter = 0;
function commoncallback(err,numberAffected,rawResponse) {
if(typeof numberAffected.result.upserted != 'undefined'){
resJSON['inserted'] = resJSON['inserted'] + numberAffected.result.upserted.length;
}
if(typeof numberAffected.result.nModified != 'undefined'){
resJSON['disabled'] = resJSON['disabled'] + parseInt(numberAffected.result.nModified);
}
if(typeof numberAffected.result.writeError != 'undefined'){
resJSON['error'] ='Error Code:'+(numberAffected.result.writeError.code)+', '+numberAffected.result.writeError.errmsg;
}
console.log(resJSON); //shows correct values
counter --;
if(counter == 0) callback(resJSON); //call your main call back here
}
for (i=0; i<jsonData.length; i++) {
if(firstCase) {
counter ++;
collection.update({'email':{$in:arrDisableRec}},
{$set:{'enabled':false}},
{multi:true},commoncallback);
} else {
//another update action
counter++;
}
}
相关文章:
- 如何从SeleniumWebdriver获取异步Javascript响应
- 使用来自不同异步函数的响应创建一个json对象
- 节点.js和表达式:如何在异步操作后返回响应
- 异步表单w/Iframe Target——OnLoad适用于FF、Chrome、IE9,不适用于;无法在IE7中得到响应
- Node.JS-如何识别哪个异步HTTPGET响应在回调中返回数据
- 接收json异步响应的最有效方式
- 如何使用 ajax 或 jquery 读取异步 HTTP (servlet3.0) 响应
- 如何将异步 ajax 响应捕获到变量中
- 函数返回异步响应
- 如何从 angularjs 服务中的异步调用返回响应
- JQuery/Ajax:如何将多个 ajaxes 组合成一个具有响应的异步 ajax
- 节点.js使用异步数据进行响应
- 等待来自异步,量角器,nodejs的响应
- 来自 Azure 的插入异步响应
- 如何处理对循环中发出的多个异步请求(AJAX 调用)的响应
- 节点JS-异步-响应是在执行查询时发送的
- 如何通过异步xmlhttprequest响应设置变量
- 如何在调用异步Web服务响应时将值设置为数组
- 异步序列的响应为false,而它应该为true
- 聚合铁ajax和异步请求(etag同步和响应处理)