Javascript AngularJS、Node.js、节点模块';幻影';。。。注入错误,angularjs试图加载我的指令+;后缀

Javascript AngularJS、Node.js、节点模块';幻影';。。。注入错误,angularjs试图加载我的指令+;后缀,javascript,angularjs,node.js,angularjs-directive,phantomjs,Javascript,Angularjs,Node.js,Angularjs Directive,Phantomjs,当我加载AngularJS页面时,它加载得很好。没有控制台错误。内容如预期所示 当我从另一个应用程序加载同一页面时,使用节点模块“phantom”失败,出现错误: 错误:[$injector:unpr] 从angular站点,此链接等同于:未知提供者:WidgetsProvider自我回答: 最终我遇到了一个文件包含问题。这在这一点上是无关紧要的。然而,我确实认为,在我的旅程中有三点值得一提 Unknown provider: WidgetsProvider <- Widgets <

当我加载AngularJS页面时,它加载得很好。没有控制台错误。内容如预期所示

当我从另一个应用程序加载同一页面时,使用节点模块“phantom”失败,出现错误:

错误:[$injector:unpr]

从angular站点,此链接等同于:
未知提供者:WidgetsProvider自我回答:

最终我遇到了一个文件包含问题。这在这一点上是无关紧要的。然而,我确实认为,在我的旅程中有三点值得一提

Unknown provider: WidgetsProvider <- Widgets <- dashboardWeightTableWidgetDirective

未知提供程序:WidgetsProvider您可能有时间问题。看看你的承诺链。您从setTimeout返回,但该值被丢弃。你需要回复一个承诺并在callbackAluan Haddad中解决它。。。使用我添加到问题中的代码:奇怪的指令错误立即弹出。然后,20秒后,我的控制台打印出来,一个空的网页到达。这表明错误发生在page.open调用中。你是否仍然怀疑承诺链、时机问题?这是一种明显的可能性。不管返回语句的存在与否,它都会以某种方式指示错误。它没有做它看起来像在做的事情。
。然后(()=>新承诺(resolve=>{setTimeout(resolve);}))。然后(()=>_page.render(conf.options.filePath)。然后(()=>{page.close();})
我还意识到了另一件事:你的外部承诺构造函数调用被破坏了。你既不解决也不拒绝它,
返回是一个错误。
angular.module('directives')
    .directive('dashboardWeightTableWidget', function (Data, Widgets, $interval, $window, $q) {
const phantom = require('phantom');
let _ph;

exports.initPhantom = function() {
    phantom.create().then(ph => {
        _ph = ph;
 })
}

exports.processPage = function(conf) {
    return new Promise(function (resolve, reject) {
    console.log("creating phantom page ...");

    let _page, _interval, _pageReady;
    let _outObj = _ph.createOutObject();

    return _ph.createPage().then(function (page) { ....
        return _page.open(conf.options.viewerUrl);
    }).then (function(){
        setTimeout(() => {
              return _page.render(conf.options.filePath).then(function (status)                                                                       {
                   page.close();
              })

...
let processPage = function(conf) {

  return new Promise(function (resolve, reject) {
    let instance = null;
    let phInstance = null;
    let reportPage = null;
    console.log("creating phantom page ...");

    let _outObj = _ph.createOutObject();

    return _ph.createPage()
      .then(function (page) {
        reportPage = page;
        _outObj.urls = [];
        _outObj.pageReady = false;

        page.property("customHeaders", {
          "Authorization": conf.options.authorization
        });
        page.property("paperSize", {
          //format: "Letter",
          format: "A4",
          margin: {
            top: '0.75in',
            left: '0.52in',
            bottom: '0.75in',
            right: '0.52in'
          }
        });
        page.property('setting', {
          resourceTimeout: 60000, // times out after 1 minute
          javascriptEnabled: true,
        });
        page.on('onConsoleMessage', function (msg, out) {
          console.log("on console msg ");
          console.log(msg);
          // should be 0 when page Widhgets are all loaded
          var loaded = msg.indexOf('getSeriesLoadingCount') > -1 ? true : false;
          if (loaded) {
            console.log('Message from console: ', msg, loaded);
            out.pageReady = true;
            _outObj = out;
          }
        }, _outObj);
        page.on('onResourceRequested', function (requestData, networkRequest, out) {
          // console.log('Request ' + JSON.stringify(requestData, undefined, 4));
          out.urls.push(requestData.url);
        }, _outObj);
        page.on("onError", function (msg, trace) {
          console.log("Error recorded: ", msg);
          trace.forEach(function (item) {
            console.log('  ', item.file, ':', item.line);
          });
        });
        page.on("onResourceError", function (resourceError) {
          page.reason = resourceError.errorString;
          page.reason_url = resourceError.url;
          console.log("Resource Error:", resourceError.errorString);
          console.log("Resource Url:", resourceError.url);
        });
        return page.open(conf.options.viewerUrl);

      })
      .then((status) => {
        let _pageReady = false;
        let _nbTrials = 0;
        // this setInterval loop is here to cycle through and check for the page being ready. It uses the PhantomJS event
        // property called 'onConsoleMessage'. This setting can be found above. It is a listener. In that listener we are
        // watching for a string that has a value of 'getSeriesLoadingCount' when the listener sees this text, it sets the
        // pageReady value to true. then this loop lets the code inside run. Primarily the rendering of the page to a file
        // in the temp directory of the server.
        _interval = setInterval(() => {
          _outObj.property('pageReady').then(function (ready) {
            if (ready === true) {
              clearInterval(_interval);
              return reportPage.render(conf.options.filePath).then(function (status) {
                reportPage.close();
                if (status) {
                  console.log('viewerUrl', conf.options.viewerUrl);
                  resolve(conf);
                } else {
                  console.log("cannot render page");
                  reject(conf);
                }
              });
            } else {
              ++_nbTrials;
              // 2 minutes
              if (_nbTrials >= 40) {
                return reject("too long generating the report");
              }
            }
          });
        }, 300);
      })
      .catch(error => {
        console.log("MAIN CATCH ERROR");
        console.log(error);
        reject(error);
      });
  });
}
Unknown provider: WidgetsProvider <- Widgets <- dashboardWeightTableWidgetDirective