错误:发送后无法设置标头。来自调用智能合约函数

时间:2017-04-24 15:05:51

标签: javascript node.js express ethereum solidity

我写了一份创建简单数据库的智能合约。它包含多个函数,当我第一次点击REST api时它会给我正确的输出但是在进一步命中时它会使节点服务器崩溃并显示一条消息 -

  

F:\项目\ blockchain \ node_modules \ SOLC \ soljson.js:1   (function(exports,require,module,__ filename,__ dirname){var Module; if(!Module)Module =(typeof Module!==“undefined”?Module:null)|| {}; var moduleOverrides = {}; for (模块中的var键){if(Module   .hasOwnProperty(key)){moduleOverrides [key] = Module [key]}} var ENVIRONMENT_IS_WEB = typeof window ===“object”; var ENVIRONMENT_IS_WORKER = typeof importScripts ===“function”; var ENVIRONMENT_IS_NODE = type   处理过程===“对象”&& typeof require ===“function”&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER; var ENVIRONMENT_IS_SHELL =!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER; if( EN   VIRONMENT_IS_NODE){if(!Module [“print”])Module [“print”] = function print(x){process [“stdout”]。write(x +“\ n”)}; if(!Module [“printErr “])Module [”printErr“] = function printErr(x){process [”stderr“]。write   (x +“\ n”)}; var nodeFS = require(“fs”); var nodePath = require(“path”); Module [“read”] = function read(filename,binary){filename = nodePath“normalize” ; var ret = nodeFS [“readFileSync”](file

     

错误:发送后无法设置标头。       在ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:344:11)       在ServerResponse.header(F:\ project \ blockchain \ node_modules \ express \ lib \ response.js:725:10)       在ServerResponse.send(F:\ project \ blockchain \ node_modules \ express \ lib \ response.js:170:12)       在ServerResponse.json(F:\ project \ blockchain \ node_modules \ express \ lib \ response.js:256:15)       在F:\ project \ blockchain \ BlockchainDB \ users \ userFunction.js:37:47       在F:\ project \ blockchain \ node_modules \ web3 \ lib \ web3 \ filter.js:120:21       at Array.forEach(native)       在F:\ project \ blockchain \ node_modules \ web3 \ lib \ web3 \ filter.js:119:32       at Array.forEach(native)       在Object.onMessage [作为回调](F:\ project \ blockchain \ node_modules \ web3 \ lib \ web3 \ filter.js:117:22)

我的api代码

module.exports.creation=function(req,res){
var user_id = req.params.user_id || req.body.user_id;
var currency = req.params.user_id || req.body.currency ;
if(user_id == undefined || currency == undefined){
    res.status(500).json({status:false,errors:"Empty parameters"});
}else{
    isaccount().then(function(accountNumber){
    if(accountNumber!=null){
        var timestamp = Date.now();
        var result = contract.createUser.sendTransaction(user_id,currency,accountNumber,timestamp,{from:web3.eth.coinbase,gas:600000});
        var event = contract.CreatedUser(function(error, result) {
                if (!error){
                   if(result.args.userId!= undefined && result.args.accountId!= undefined && result.args.categoryId!= undefined){
                          logger.info("user created with id :"+result);
                          res.status(200).json({status:true,data:{iduser:result.args.userId,accountId:result.args.accountId,created_at:timestamp}});
                    }else{
                        logger.info("user creation have problem :");
                       res.status(500).json({status:false,errors:"no response"});
                      }
                }else{
                     logger.error(error);
                    res.status(500).send(false);
                }
            });
    }else{
        logger.debug("Problem in accountNumber generation");
        res.status(500).send(false);
    }
       });
}

}

请帮我解决这个问题

提前致谢

1 个答案:

答案 0 :(得分:0)

尝试对所有return来电使用res.status()语句。所以,即使一旦响应状态被设置为某种东西,它也会在它之后的某个地方再次获得res.status()。