当前位置: 首页 > 知识库问答 >
问题:

TypeError:无法读取未定义的属性“method”

罗安宁
2023-03-14

当试图为我们得到的方法运行RPC命令时,我似乎无法解决这个问题。它在本地工作,但不是在实时linux服务器上。

TypeError:无法读取C:\ssc exchange Transactions\app上未定义的属性“method”。第二层的js:23:13。在路由的下一个(C:\ssc exchange Transactions\node\u modules\express\lib\router\layer.js:95:5)处(C:\ssc exchange Transactions\node\u modules\express\lib\router\route.js:137:13)处理[作为句柄\u请求](C:\ssc exchange Transactions\node\u modules\express\lib\router\route.js:。层上的调度(C:\ssc exchange Transactions\node\u modules\express\lib\router\route.js:112:3)。在C:\ssc exchange Transactions\node\u modules\express\lib\router\layer.js:95:5处处理[作为句柄\u请求](C:\ssc exchange Transactions\node\u modules\express\lib\router\index)。js:281:22 at功能。在jsonParser(C:\ssc exchange Transactions\node\u modules\express\lib\router\index.js:335:12)的下一层(C:\ssc exchange Transactions\node\u modules\express\lib\router\index.js:275:10)中处理参数(C:\ssc exchange Transactions\node\u modules\body parser\lib\types\json.js:119:7)。handle[作为handle\u请求](C:\ssc exchange transactions\node\u 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.com');
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 command', 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.com/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);
});

共有1个答案

胥诚
2023-03-14

您的代码在第一次尝试/捕获块中出现错误的情况下中断,这是您这边的语义错误。

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

1.JS中的变量提升

检查js中变量hoising的主题:https://developer.mozilla.org/en-US/docs/Glossary/Hoisting

简而言之,根据您的示例,这意味着JS编译器将在post函数的最顶端创建一个名为body的变量,该变量的初始值为undefined。这是因为您使用了var关键字,而不是const/let。

只有在JSON. parse()正常工作的情况下,才会设置body变量的值。如果出现这种情况(似乎发生在您身上)或出现错误,body将永久保持未定义状态,这意味着您无法访问其属性(如方法),因为它不是对象。

解决方案取决于您想在这里实现的目标:

  1. 你可以把剩下的代码放在try/catwell里面
  2. 您还可以添加一个额外的身体检查
  3. 您可以重构代码,使其更具可读性(当然,这总是主观的,取决于编码风格)

这里有一个重构示例:

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 command', error: err });
  }
});

如果您想避免分裂成几个函数,您可以执行以下操作

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 command', error: err });
      }
    });

考虑到一切都包裹在里面,尝试/捕捉没有必要特别检查身体在这里未定义。

 类似资料:
  • 如果函数在组件中,那么一切都很好。如果我把它单独取出并导出到一个组件中,那么我会得到一个错误TypeError:不能读取未定义的属性(读取'reduce')

  • 问题内容: 我试图在ajax回调从REST api接收数据后设置组件的setState。这是我的组件构造函数代码 然后,我有一个如下所示的方法。 现在,这是我执行getAJAX请求的getPosts函数。 我想设置状态,但出现以下错误。 不太清楚是什么原因造成的。如果有人指出我正确的方向,那将真的很有帮助。提前致谢。 问题答案: 还绑定回调函数,以便回调内部指向React Component的上下

  • 我试图使用node.js express web服务器中的@tensorflow/tfjs-node模块。但是,我得到了下面的错误。我不明白为什么我会出现这个错误。我刚刚在node.js服务器中添加了1行代码。我使用“npm install@tensorflow/tfjs-node”完成的安装。可能的问题是什么? null 先谢谢你, var nonMaxSuppressionV3Impl=tf.

  • 我正在尝试联系许多对许多,在两个模式“培训和培训课程”,所以我做了第三个模式“课程”,以尝试关系1对许多。但是我得到了一个错误: null TypeError:无法读取对象上未定义得属性“belongsto”。(c:UsersDellDownloadsGraphql-12.18.2020Graphql-12.18.2020Graphql-12.18.2020ServerAppDatabaseDat

  • 上面的函数返回一个类似“failed”的字符串。但是,当我尝试在其上运行then函数时,它将返回 并且光标指示在之后和。 下面是完整的功能: 更新 下面是函数 我确信将导致一个“failed”字符串。没别的了。

  • 无法显示Barchart。 我有一个包含数据的表,它是可拖动的。在表格旁边我有一个两个dropbox被拖动的表格中的数据可以被拖动到框中。当将数据拖动到框中时,应该会显示条形图。 这是我的家。component.html 这是我的家。Component.TS 这是我的酒吧 在拖放数据时,特定的图表必须显示在Dropbox上。