‘TypeError: 无法初始化连接器 undefined: 无法读取未定义的属性 ‘root”

huangapple go评论101阅读模式
英文:

'TypeError: Cannot initialize connector undefined: Cannot read property 'root' of undefined'

问题

I'm using loopback3.x. I want to integrate 3rd party APIs with loopback. For that while using loopback-connector-rest shows the error 'TypeError: Cannot initialize connector undefined: Cannot read property 'root' of undefined'. How to fix it?

Datasource configuration

"restDataSource": {
"name": "restDataSource",
"baseURL": "",
"crud": true,
"connector": "rest",
"debug": false,
"options": {
"headers": {
"accept": "application/json",
"content-type": "application/json",
"authorization": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
"strictSSL": false
},
"operations": [{
"template": {
"method": "POST",
"url": "https://fcm.googleapis.com/fcm/send",
"options": {
"strictSSL": true,
"useQuerystring": true
}
},
"functions": {
"notify": ["title", "text", "click_action", "keyname", "to"]
}
}]
}

Error

TypeError: Cannot create data source "restDataSource": Cannot initialize connector "rest": Cannot read property 'root' of undefined
at /home/veena-msl/Documents/care-doc-api/node_modules/loopback-connector-rest/lib/rest-connector.js:93:28
at Array.forEach ()
at /home/veena-msl/Documents/care-doc-api/node_modules/loopback-connector-rest/lib/rest-connector.js:87:22
at Array.forEach ()
at Function.initializeDataSource [as initialize] (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-connector-rest/lib/rest-connector.js:52:25)
at DataSource.setup (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-datasource-juggler/lib/datasource.js:493:19)
at new DataSource (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-datasource-juggler/lib/datasource.js:138:8)
at Registry.createDataSource (/home/veena-msl/Documents/care-doc-api/node_modules/loopback/lib/registry.js:364:12)
at dataSourcesFromConfig (/home/veena-msl/Documents/care-doc-api/node_modules/loopback/lib/application.js:570:19)
at Function.app.dataSource (/home/veena-msl/Documents/care-doc-api/node_modules/loopback/lib/application.js:269:14)
at /home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:191:9
at /home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:282:5
at Array.forEach ()
at forEachKeyedObject (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:281:20)
at setupDataSources (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:181:3)
at execute (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:39:3)

英文:

I'm using loopback3.x. I want to integrate 3rd party APIs with loopback. For that while using loopback-connector-rest shows the error 'TypeError: Cannot initialize connector undefined: Cannot read property 'root' of undefined'. How to fix it?

Datasource configuration

   "restDataSource": {
    "name": "restDataSource",
    "baseURL": "",
    "crud": true,
    "connector": "rest",
    "debug": false,
    "options": {
      "headers": {
        "accept": "application/json",
        "content-type": "application/json",
        "authorization": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
      },
      "strictSSL": false
    },
    "operations": [{
      "template": {
        "method": "POST",
        "url": "https://fcm.googleapis.com/fcm/send",
        "options": {
          "strictSSL": true,
          "useQuerystring": true
        }
      },
      "functions": {
        "notify": ["title", "text", "click_action", "keyname", "to"]
      }
    }]
  }

> Error

TypeError: Cannot create data source "restDataSource": Cannot initialize connector "rest": Cannot read property 'root' of undefined
    at /home/veena-msl/Documents/care-doc-api/node_modules/loopback-connector-rest/lib/rest-connector.js:93:28
    at Array.forEach (<anonymous>)
    at /home/veena-msl/Documents/care-doc-api/node_modules/loopback-connector-rest/lib/rest-connector.js:87:22
    at Array.forEach (<anonymous>)
    at Function.initializeDataSource [as initialize] (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-connector-rest/lib/rest-connector.js:52:25)
    at DataSource.setup (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-datasource-juggler/lib/datasource.js:493:19)
    at new DataSource (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-datasource-juggler/lib/datasource.js:138:8)
    at Registry.createDataSource (/home/veena-msl/Documents/care-doc-api/node_modules/loopback/lib/registry.js:364:12)
    at dataSourcesFromConfig (/home/veena-msl/Documents/care-doc-api/node_modules/loopback/lib/application.js:570:19)
    at Function.app.dataSource (/home/veena-msl/Documents/care-doc-api/node_modules/loopback/lib/application.js:269:14)
    at /home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:191:9
    at /home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:282:5
    at Array.forEach (<anonymous>)
    at forEachKeyedObject (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:281:20)
    at setupDataSources (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:181:3)
    at execute (/home/veena-msl/Documents/care-doc-api/node_modules/loopback-boot/lib/executor.js:39:3)

答案1

得分: 5

在“functions”部分,您已经定义了一个名为“notify”的函数,接受多个输入参数:“title”、“text”、“click_action”、“keyname”、“to”。然而,“template”部分没有提供如何将这些参数映射到HTTP请求的任何信息。例如,“title”应该通过URL查询还是在请求体中发送?

如果我理解正确,您正在尝试使用传统的Firebase Cloud Messaging HTTP API,如此处所述:https://firebase.google.com/docs/cloud-messaging/http-server-ref 根据该文档,我认为您函数的所有参数都应该在请求体中发送。

看起来LoopBack的REST连接器没有正确检测和处理当输入参数未映射到任何HTTP源时的情况。它不应该崩溃,可以随时在https://github.com/strongloop/loopback-connector-rest/issues 上报告错误。

以下是一个不会使服务器崩溃的配置。我没有Firebase帐户来验证它是否按预期工作。

"template": {
  "method": "POST",
  "url": "https://fcm.googleapis.com/fcm/send",
  "options": {
    "strictSSL": true,
    "useQuerystring": true
  },
  "body": {
    "title": "{title:string}",
    "text": "{text:string}",
    "click_action": "{click_action:string}",
    "keyname": "{keyname:string}",
    "to": "{to:string}"
  }
}

您可以在连接器文档中了解有关如何配置输入参数的不同方法的更多信息:https://loopback.io/doc/en/lb3/REST-connector.html#defining-a-custom-method-using-a-template

英文:

In the functions section, you have defined a function notify accepting several input arguments: title, text, click_action, keyname, to. However, the template section does not provide any information on how to map those arguments to an HTTP request. For example, is the title supposed to be sent via URL query or in the request body?

IIUC, you are trying to use the legacy Firbase Cloud Messaging HTTP API as described here: https://firebase.google.com/docs/cloud-messaging/http-server-ref Based on that documentation, I think all arguments of your function should be sent in the request body.

It looks like LoopBack's REST connector is not correctly detecting and handling the situation when an input argument is not mapped to any HTTP source. It should not be crashing, feel free to open a bug report in https://github.com/strongloop/loopback-connector-rest/issues

Here is a configuration that does not crash the server. I don't have a Firebase account to verify that it's working as expected.

    "template": {
      "method": "POST",
      "url": "https://fcm.googleapis.com/fcm/send",
      "options": {
        "strictSSL": true,
        "useQuerystring": true
      },
      "body": {
        "title": "{title:string}",
        "text": "{text:string}",
        "click_action": "{click_action:string}",
        "keyname": "{keyname:string}",
        "to": "{to:string}"
      }
    },

You can learn more about different ways how to configure input arguments in the connector documentation: https://loopback.io/doc/en/lb3/REST-connector.html#defining-a-custom-method-using-a-template

huangapple
  • 本文由 发表于 2020年1月6日 18:27:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/59610418.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定