如何在Node中的另一个JS文件中加载JS文件

时间:2019-06-13 15:45:40

标签: node.js

无法在我的应用程序中加载JS文件(得到未定义),并且我想模拟与纯HTML中的标记相同的效果。

我尝试过

从'./api'->导入Api告诉我,没有一个定义的函数是一个函数(没有任何循环依赖项),所以我最好的猜测是Api没有被初始化或什么?

在Api上尝试了module.exports->告诉我Api未定义

尝试了exports.Api->告诉我,我尝试从Api调用的函数不是函数

我试图要求一些其他事情,而我什至不记得了,这些似乎都不起作用。主要问题是我无法识别所涉及的JS文件的格式,因为我从未见过将变量声明为包含其他函数的函数,因此在tbh中可能会很方便地进行解释。


var Api = (function() {
  var requestPayload;
  var responsePayload;
  var messageEndpoint = '/api/message';

  var sessionEndpoint = '/api/session';

  var sessionId = null;

  // Publicly accessible methods defined
  return {
    sendRequest: sendRequest,
    getSessionId: getSessionId,

    // The request/response getters/setters are defined here to prevent internal methods
    // from calling the methods without any of the callbacks that are added elsewhere.
    getRequestPayload: function() {
      return requestPayload;
    },
    setRequestPayload: function(newPayloadStr) {
        requestPayload = JSON.parse(newPayloadStr);
    },
    getResponsePayload: function() {
      return responsePayload;
    },
    setResponsePayload: function(newPayloadStr) {
      responsePayload = JSON.parse(newPayloadStr);
    },
    setErrorPayload: function() {
    }
  };

  function getSessionId(callback) {
    var http = new XMLHttpRequest();
    http.open('GET', sessionEndpoint, true);
    http.setRequestHeader('Content-type', 'application/json');
    http.onreadystatechange = function () {
      if (http.readyState === XMLHttpRequest.DONE) {
        var res = JSON.parse(http.responseText);
        sessionId = res.session_id;
        callback();
      }
    };
    http.send();
  }

  // Send a message request to the server
  function sendRequest(text, context) {
    // Build request payload
    var payloadToWatson = {
      session_id: sessionId
    };

    payloadToWatson.input = {
      message_type: 'text',
      text: text,
    };

    if (context) {
      payloadToWatson.context = context;
    }

    // Built http request
    var http = new XMLHttpRequest();
    http.open('POST', messageEndpoint, true);
    http.setRequestHeader('Content-type', 'application/json');
    http.onreadystatechange = function() {
      if (http.readyState === XMLHttpRequest.DONE && http.status === 200 && http.responseText) {
        Api.setResponsePayload(http.responseText);
      } else if (http.readyState === XMLHttpRequest.DONE && http.status !== 200) {
        Api.setErrorPayload({
          'output': {
            'generic': [
              {
                'response_type': 'text',
                'text': 'Something went wrong.'
              }
            ],
          }
        });
      }
    };

    var params = JSON.stringify(payloadToWatson);
    // Stored in variable (publicly visible through Api.getRequestPayload)
    // to be used throughout the application
    if (Object.getOwnPropertyNames(payloadToWatson).length !== 0) {
      Api.setRequestPayload(params);
    }

    http.send(params);
  }
}());
上面的代码是由IBM提供的(我正在尝试使用的Watson Assistant),并且该代码是针对Node.JS应用程序的,该应用程序可以正常工作。 由于上面的代码只是通过他们index.html和voila中的标签包含在应用程序中,因此它可以正常工作,但是我没有那种能力(请参阅下文)。 我的问题是他们的应用程序也是客户端应用程序,我想将所有这些“后端”内容都转移到我的REST API中,这就是为什么我尝试使用上面的代码。

1 个答案:

答案 0 :(得分:1)

var Api = (function() {
  var messageEndpoint = "/api/message";

  // Publicly accessible methods defined
  return {
    messageEndpoint: messageEndpoint
  };
})();
module.exports = Api ;

您可以像

一样使用它
const api = require("./api");
console.log(api);

因此,基本上只需在api文件中添加module.exports = Api ;,您就可以使用它。