javascript - TypeError: Cannot read property 'method' of undefined - Stack Overflow

When trying to run the RPC mands for the methods we get, I can't seem to figure out the issue. It

When trying to run the RPC mands for the methods we get, I can't seem to figure out the issue. It was working on local but not on the live linux server.

TypeError: Cannot read property 'method' of undefined at C:\ssc-exchange-tranactions\app.js:23:13 at Layer.handle [as handle_request] (C:\ssc-exchange-tranactions\node_modules\express\lib\router\layer.js:95:5) at next (C:\ssc-exchange-tranactions\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (C:\ssc-exchange-tranactions\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (C:\ssc-exchange-tranactions\node_modules\express\lib\router\layer.js:95:5) at C:\ssc-exchange-tranactions\node_modules\express\lib\router\index.js:281:22 at Function.process_params (C:\ssc-exchange-tranactions\node_modules\express\lib\router\index.js:335:12) at next (C:\ssc-exchange-tranactions\node_modules\express\lib\router\index.js:275:10) at jsonParser (C:\ssc-exchange-tranactions\node_modules\body-parser\lib\types\json.js:119:7) at Layer.handle [as handle_request] (C:\ssc-exchange-tranactions\node_modules\express\lib\router\layer.js:95:5)

const express = require("express");
const bodyParser = require("body-parser");
const request = require("request");
const port = 5000;
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
const dsteem = require('dsteem');
const client = new dsteem.Client('');
app.set('trust proxy', true);
app.disable('x-powered-by');


app.post('/', function(req,res){
    try
    {
    var body=JSON.parse(req.body.curl);
    }
    catch(err)
    {
     res.send({msg: 'invalid mand', error: err});
    }
    if(body.method !=undefined && body.method == "POST")
    {
    let options = {
      url:body.url,
      method:body.method,
      headers:body.headers,
      body: JSON.stringify(body.body)
    };
    request(options, (error, response, body) => {
      if (error) {
        console.error("An error has occurred: ", error);
        res.send(error);
      }
      else {
        let responseData = JSON.parse(body);
        res.send(responseData);
      }
    });
  }
  ///Ends if
  else if(body.method != undefined && body.method == "GET")
  {
    let options = {
    //   url: body.url+'?account='+body.body.params.account+'&limit='+body.body.params.limit+
    //   '&offset='+body.body.params.offset+'&&symbol='+body.body.params.symbol,
         url: ''+body.symbol,
         method: "GET",
         headers: {"Content-type": "application/json"},
    };
    request(options, (error, response, body) => {
      if (error) {
        console.error("An error has occurred: ", error);
        res.send(error);
      }
      else {
         var withdraw = [], deposit = [];
         body= JSON.parse(body);
         body.forEach(el => {
           if(el.from == "account"){
            delete el.block;
            delete el.symbol;
            delete el.from_type;
            delete el.to_type;
             withdraw.push(el);
           }
           else{
            delete el.block;
            delete el.symbol;
            delete el.from_type;
            delete el.to_type;
            deposit.push(el);
           }

         });
         res.json([{"WITHDRAWS": withdraw},{"DEPOSITS":deposit}]);
      }
    });
  }
  //ends else if
  else
  {
    const active_key = body.wif;
    const key = dsteem.PrivateKey.fromString(active_key);
    const account = "account";
    const my_id= "mainnet";
    const my_data= {"contractName":"tokens", "contractAction":"transfer","contractPayload":{"symbol": "omg",
    "to": body.to,"quantity":body.quantity,"memo": body.memo }};
    client.broadcast.json({
        required_auths: [account],
        required_posting_auths: [],
        id: my_id,
        json: JSON.stringify(my_data),
    }, key).then(
        result => {res.send(result)},
        error => {res.send({msg: 'Something went wrong', error: error})}
    )
  }
  //ends else
  });

app.listen(port, function () {
  console.log("Server listening on port: " + port);
});

When trying to run the RPC mands for the methods we get, I can't seem to figure out the issue. It was working on local but not on the live linux server.

TypeError: Cannot read property 'method' of undefined at C:\ssc-exchange-tranactions\app.js:23:13 at Layer.handle [as handle_request] (C:\ssc-exchange-tranactions\node_modules\express\lib\router\layer.js:95:5) at next (C:\ssc-exchange-tranactions\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (C:\ssc-exchange-tranactions\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (C:\ssc-exchange-tranactions\node_modules\express\lib\router\layer.js:95:5) at C:\ssc-exchange-tranactions\node_modules\express\lib\router\index.js:281:22 at Function.process_params (C:\ssc-exchange-tranactions\node_modules\express\lib\router\index.js:335:12) at next (C:\ssc-exchange-tranactions\node_modules\express\lib\router\index.js:275:10) at jsonParser (C:\ssc-exchange-tranactions\node_modules\body-parser\lib\types\json.js:119:7) at Layer.handle [as handle_request] (C:\ssc-exchange-tranactions\node_modules\express\lib\router\layer.js:95:5)

const express = require("express");
const bodyParser = require("body-parser");
const request = require("request");
const port = 5000;
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
const dsteem = require('dsteem');
const client = new dsteem.Client('https://api.site.');
app.set('trust proxy', true);
app.disable('x-powered-by');


app.post('/', function(req,res){
    try
    {
    var body=JSON.parse(req.body.curl);
    }
    catch(err)
    {
     res.send({msg: 'invalid mand', error: err});
    }
    if(body.method !=undefined && body.method == "POST")
    {
    let options = {
      url:body.url,
      method:body.method,
      headers:body.headers,
      body: JSON.stringify(body.body)
    };
    request(options, (error, response, body) => {
      if (error) {
        console.error("An error has occurred: ", error);
        res.send(error);
      }
      else {
        let responseData = JSON.parse(body);
        res.send(responseData);
      }
    });
  }
  ///Ends if
  else if(body.method != undefined && body.method == "GET")
  {
    let options = {
    //   url: body.url+'?account='+body.body.params.account+'&limit='+body.body.params.limit+
    //   '&offset='+body.body.params.offset+'&&symbol='+body.body.params.symbol,
         url: 'https://api.site./accounts/history'+body.symbol,
         method: "GET",
         headers: {"Content-type": "application/json"},
    };
    request(options, (error, response, body) => {
      if (error) {
        console.error("An error has occurred: ", error);
        res.send(error);
      }
      else {
         var withdraw = [], deposit = [];
         body= JSON.parse(body);
         body.forEach(el => {
           if(el.from == "account"){
            delete el.block;
            delete el.symbol;
            delete el.from_type;
            delete el.to_type;
             withdraw.push(el);
           }
           else{
            delete el.block;
            delete el.symbol;
            delete el.from_type;
            delete el.to_type;
            deposit.push(el);
           }

         });
         res.json([{"WITHDRAWS": withdraw},{"DEPOSITS":deposit}]);
      }
    });
  }
  //ends else if
  else
  {
    const active_key = body.wif;
    const key = dsteem.PrivateKey.fromString(active_key);
    const account = "account";
    const my_id= "mainnet";
    const my_data= {"contractName":"tokens", "contractAction":"transfer","contractPayload":{"symbol": "omg",
    "to": body.to,"quantity":body.quantity,"memo": body.memo }};
    client.broadcast.json({
        required_auths: [account],
        required_posting_auths: [],
        id: my_id,
        json: JSON.stringify(my_data),
    }, key).then(
        result => {res.send(result)},
        error => {res.send({msg: 'Something went wrong', error: error})}
    )
  }
  //ends else
  });

app.listen(port, function () {
  console.log("Server listening on port: " + port);
});
Share Improve this question edited Feb 22, 2019 at 18:35 Just a Tester asked Feb 19, 2019 at 21:46 Just a TesterJust a Tester 111 gold badge1 silver badge4 bronze badges 5
  • What do you expect body (or rather req.body.curl) to contain? – user5734311 Commented Feb 19, 2019 at 22:03
  • Ok, well you can't call JSON.parse() on that without first getting rid of the stuff that isn't JSON. – user5734311 Commented Feb 20, 2019 at 6:17
  • @iBug rolled back. – Alex McMillan Commented Feb 22, 2019 at 1:20
  • @AlexMcMillan Thanks. Did you know that ment is automated? :P – iBug Commented Feb 22, 2019 at 1:57
  • @iBug no I didn't - but damn that's choice! Well done :) – Alex McMillan Commented Feb 22, 2019 at 2:15
Add a ment  | 

1 Answer 1

Reset to default 2

Your code breaks in the case of an error inside your first try/catch block, which is a semantic error by your side.

try
{
  var body=JSON.parse(req.body.curl);
}
catch(err)
{
   res.send({msg: 'invalid mand', error: err});
}

1. Variable hoisting in JS

Check the topic of variable hoising in js: https://developer.mozilla/en-US/docs/Glossary/Hoisting

In short, based on your example, this means that JS piler will create a variable called body inside your post function at the very top of the function, which has the initial value of undefined. This happens because you used the var keyword for it, in contrast to const/let.

Only in the case of JSON.parse() working properly, the value of the body variable will be set. In case of this failing (which happens to you as it seems) or getting an error, body will remain undefined permanently, meaning you cannot access its properties such as method, as it is not an object.

Solutions depend on what you want to achieve here:

  1. You can put the rest of the code inside try/catch aswell
  2. You can add an additional check for body aswell
  3. You could refactor the code a bit to be more readable (which is always subjective of course and depends on the coding style)

An example for refactoring here:

app.post('/', function(req, res) {
  try {
    const body = JSON.parse(req.body.curl);

    switch (body.method) {
      case 'GET':
        this.handleGETRequest();
      case 'POST':
        this.handlePOSTRequest();
      default:
        this.handleDefault();
    }
  } catch (err) {
    res.send({ msg: 'invalid mand', error: err });
  }
});

If you want to avoid splitting into several functions, you could do something like

app.post('/', function(req, res) {
      try {
        const body = JSON.parse(req.body.curl);

        // Your current else 
        if(!body.method) {
            ...code
            return; // Will break the execution after this
        }

        ...your normal if/else here with simplified checks now
      } catch (err) {
        res.send({ msg: 'invalid mand', error: err });
      }
    });

Considering that everything is wrapped inside try/catch no need to specifically check for body being undefined here.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745617320a4636312.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信