首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS Tesla项目中继承与模块的结合

NodeJS Tesla项目中继承与模块的结合
EN

Stack Overflow用户
提问于 2020-04-22 05:18:53
回答 1查看 35关注 0票数 0

我正在尝试使用快递和请求模块制作一个简单的NodeJS应用程序。在本例中,我试图实现策略设计模式,以清理在整个应用程序中发出的不同HTTP请求。我的想法是让一个Options类作为基类,然后让accessToken、getVehicleID、getVehicleStatus等扩展这个基类,只覆盖必需项(即不同的主体内容、添加到标题中、将方法从'POST‘更改为'GET’等)。但是,我不确定这是否是正确的方法,因为我对JS相当陌生,而且现在正在获得错误“选项未定义”。任何帮助都将不胜感激!希望有一个更可伸缩的设计。

我的选项类如下所示:

代码语言:javascript
复制
Options = (function() {

  function construct() { 
    var self = this;
    var requestURL = '';
    var requestMethod = '';
    var requestHeaders = {};
    var requestBody = {};
  };
   /**
   * Modify request type (i.e. GET, POST, etc.)
   */
  construct.prototype.modifyRequestMethod = function() {
    throw new Error('You have to implement the method doSomething!');
 }

  /**
   * Modify URL
   */
  construct.prototype.modifyUrl = function() {
    throw new Error('You have to implement the method doSomething!');
 }

 /**
  * Modify the request headers
  */
 construct.prototype.modifyHeaders = function() {
    throw new Error('You have to implement the method doSomething!');
  }

  /**
   * Modify the request body
   */
  construct.prototype.modifyBody = function(){
    throw new Error('You have to implement the method doSomething!');
  }

  construct.prototype.updateOptions = function() {
    modifyRequestMethod();
    modifyUrl();
    modifyHeaders();
    modifyBody()
  }

  construct.prototype.returnOptions = function() {
  return {
    url: this.requestURL,
    method: this.requestMethod,
    json: true,
    headers: this.requestHeaders,
    gzip: true,
    body: this.requestBody 
  };
}

  return construct;  

})();

其中一个派生类(accessToken )是:

代码语言:javascript
复制
accessToken = (function(){

    function construct() {
        console.log("Child");
        Options.apply(this, arguments);
        updateOptions();
        returnOptions();
    }


    construct.prototype.modifyRequestMethod = function() {
        this.requestMethod = 'POST';
 }

    construct.prototype.modifyUrl = function() {
        this.requestURL = 'https://owner-api.teslamotors.com/oauth/token';
 }

    construct.prototype.modifyHeaders = function() {
        this.requestHeaders = {
        "x-tesla-user-agent": "TeslaApp/3.4.4-350/fad4a582e/android/8.1.0",
        "user-agent": "Mozilla/5.0 (Linux; Android 8.1.0; Pixel XL Build/OPM4.171019.021.D1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/68.0.3440.91 Mobile Safari/537.36",
        "Content-Type": "application/json",
        "charset": "utf-8"
      }
  }

    construct.prototype.modifyBody = function(){
        this.requestBody = {
        "grant_type": 'password',
        "client_id": '81527cff06843c8634fdc09e8ac0abefb46ac849f38fe1e431c2ef2106796384',
        "client_secret": 'c7257eb71a564034f9419ee651c7d0e5f7aa6bfbd18bafb5c5c033b093bb2fa3',
        "email": 'myEmail',
        "password": 'myPassword'
      };
  }

  return construct;


})();

然后在主应用程序app.js中:

代码语言:javascript
复制
const express = require("express");
const app = express();
var path = require("path");
var bodyParser = require("body-parser");
var rp = require('request-promise');
const port = 3000;
var firstRequest = require('./helper/accessToken.js');


app.use(express.static(path.join(__dirname, '/public')));
app.set("view engine", "ejs");

let firstRequest = new accessToken();
var myaccessToken;

app.get("/", async(req, resp) => {

  firstRequest.updateOptions();
  const first_response = await rp(firstRequest.returnOptions());
  myaccessToken = (JSON.parse(JSON.stringify(first_response))).access_token;

});


app.listen(port, () => {console.log('Example app listening on port ${port}!') } )
EN

回答 1

Stack Overflow用户

发布于 2020-04-22 05:29:01

您需要导出Options,以便在新文件中需要它。

例如,在Options.js

代码语言:javascript
复制
var Options = ...
module.exports = Options

然后,在accessToken.jsapp.js

代码语言:javascript
复制
var Options = require("./Options.js")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61357789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档