exports.saveUserInterfaceConfig = function(req,res){
var body = req.body;
console.log('body:['+JSON.stringify(body)+']');
var mysql = require('mysql');
var UiConfigId = [];
var connection = getDBConnection();
if(body && connection){
connection.beginTransaction(function(err){
if (err) {
/*var errorObj = {error:{code:0, text:'backend error'}};
return res.json(200, errorObj);*/
throw err;
}
var companyId = body.companyId;
var moduleId = body.moduleId;
var submoduleId = body.submoduleId;
var formfieldsId = body.formfieldsId;
for(var index3 in formfieldsId){
var UIConfigInfo = {Company_CompanyId: companyId, Modules_ModuleId: moduleId, SubModule_SubModuleId: submoduleId, SubmoduleFieldConfig_SubmoduleFieldConfigId: formfieldsId[index3]};
var saveUIConfigQuery = 'INSERT INTO ui_config SET ?';
connection.query(saveUIConfigQuery, UIConfigInfo, function(err, result) {
if (err) {
return connection.rollback(function() {
throw err;
});
}
UiConfigId.push(result.insertId);
console.log('result:['+JSON.stringify(result)+']');
connection.commit(function(err) {
if (err) {
return connection.rollback(function() {
connection.end(function(err) {
// The connection is terminated now
});
throw err;
});
} else {
connection.end(function(err) {
// The connection is terminated now
});
}
return res.json(200,{UiConfigId: UiConfigId});
console.log('UiConfigId:['+JSON.stringify(UiConfigId)+']');
console.log('success!');
// connection.release();
});
})
}
})
}
}
我在我的Node API中有上述内容。我必须多次在循环中执行相同的查询。但即时通讯面临一个问题,放置返回语句,我得到以下错误。
错误:发送后无法设置标头。 在ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:335:11)
我该如何解决?
答案 0 :(得分:0)
您收到该错误的原因是因为您在循环中多次调用res.json。
首先,您应该使用回调机制在循环中执行查询。对于它来说,即使其他查询完成之前执行多个查询也会搞砸。
在回复时,它也应该通过基于条件的回调来完成。条件可以是检查您是否已成功完成所有查询。
这是一个页面,其中包含您所需要的详细信息: https://mostafa-samir.github.io/async-iterative-patterns-pt1/
答案 1 :(得分:0)
你在循环中多次调用res.json,这就是你得到错误的原因..
简单来说。在发送回复后传递语句或其他内容时会出现这种类型的错误。
例如:
res.send("something response");
console.log("jhgfjhgsdhgfsdf");
console.log("sdgsdfhdgfdhgsdf");
res.send("sopmething response");
它生成,你得到的错误。!! Beccoz一旦发送了响应,以下res.send将不会被执行。因为,我们每次请求只能发送一次响应。!! 为此你需要使用回调。
祝你好运