【问题标题】:How get them to work - npm & sails (html-pdf)如何让他们工作 - npm &sails (html-pdf)
【发布时间】:2017-10-27 00:11:30
【问题描述】:

编辑:好吧,我会保持简单,如果需要,我会在其他帖子中询问我的所有其他问题。原来的帖子太庞大了,希望有人能通过指南回答我,了解如何充分发挥帆的潜力。对不起。

首先,我对 angular、npm 和sails.js 还是很陌生,但我有一个非常好的 Javascript 基础。

我所知道的所有这些都来自“Sails.js in Action”一书。

我正在尝试使用一个 npm 包(命名为 html-pdf),但我无法让它工作。

我需要从网页创建一个 pdf 发票。

所以我通过npm install html-pdf --save 将html-pdf 包安装到我的sails 项目中。然后只是为了测试它并让它工作,我使用了我目前空白的主页并添加了一些文本和一个“另存为 pdf”按钮。

这是 ejs 主页代码(在视图中):

<div ng-controller="homePageCtrl" class="homepage" ng-cloak>
    <div class="container">
      <div class="row">
        <center>
            <br /><h1>Accueil</h1><br /><br />
            <h3>Bienvenue !</h3><br /><br />
            <h3>Test création PDF</h3><br />
            <h4>Si vous avez des questions ou des problèmes,</h4>
            <h4>veuillez contacter l'assistance technique.</h4>
            <br /><br />
            <button class="btn btn-success btn-lg" type="button" ng-click="printPdf()">
              <span>Imprimer</span>
              </button>
        </center>
      </div>
    </div>
  </div>

现在这是我为我的 assets/js/controllers/homePageCtrl.js 中的 printPdf 函数尝试的第一件事(示例代码的副本):

angular.module('teknik').controller('homePageCtrl', ['$scope', '$http', function($scope, $http) {

    $scope.printPdf = function(){
      var fs = require('fs');
      var pdf = require('html-pdf');
      var html = fs.readFileSync('./views/homepage.ejs', 'utf8');
      var options = { format: 'Letter' };

      pdf.create(html, options).toFile('/pdfs/test.pdf', function(err, res) {
        if (err) return console.log(err);
        console.log(res); 
      });
    };

}]);

它在var fs = require('fs'); 行上给了我一个错误(找不到变量:需要),所以我后来尝试了一些更改。我找到了这个示例Sails EJS-view after html-pdf usage does not render image 并尝试更改代码以满足我的需要,但它也在代码的开头给了我一个错误(同样的错误,但我不再有那个适应了)。

【问题讨论】:

  • “我尝试安装并在我的项目中工作的所有 npm 包都失败了”。究竟出了什么问题?每次都是不同的问题吗?
  • 是的,每次都不一样。对于模板,我可以在开始后自行安装它,但是当尝试 npm install 将它放入我的sails项目时,它确实安装了,但我不知道如何设置它,经过几个小时的尝试,甚至在这里问但没有得到答案我放弃并继续。对于预输入,我尝试使用 npm 包或引导程序,并遵循了很多示例,但它从未奏效。我不想在我的项目中加入很多不需要的包或库,所以我尝试了很多方法来看看哪种方法最好,但没有一个奏效。
  • 嗨,欢迎来到 Stack Overflow!以目前的形式,这个问题并不适合 Stack Overflow,并且可能会被否决。我建议你用一个具体的例子重写它。找到你想用 npm 安装的东西,并准确地告诉我们你在终端中写了什么,以及你得到了什么输出。一个最小的可行示例将有助于将其转变为一个可回答且恰当提出的问题,并会很快为您提供答案。
  • 另外,当您添加最小可行示例时,您应该将问题的大小减少到一个段落以下。只需说出您尝试了什么,它是如何失败的,然后重申您遇到的问题/您希望解决的问题。
  • 我听从了你的建议,我还是新手,谢谢。

标签: javascript angular npm sails.js


【解决方案1】:

我不是这个主题的专家,但我想我可以准确地看出你的知识差距给你带来了这么多麻烦。

npm 模块,以及它们附带的大部分文档,都适合在在服务器上运行的代码中使用这些模块。从我在上面的代码中可以看出,您正在客户端的浏览器中运行代码。 Npm 模块和他们使用的整个require 框架并没有在那里设置。

在 Sails 中,您在控制器、服务和模型中编写的代码(/api/ 文件夹中的几乎所有内容都在服务器端运行,因此需要和使用 npm 模块都可以在那里工作。

您放入/assets/ 文件夹的代码不同。此处的文件具有发送(未运行)到客户端计算机上的浏览器并在那里运行的 javascript。 Npm 模块未设置为在那里工作。

Sails 视图有点令人困惑:模板是在服务器端完成的(所有 &lt;% ... %&gt; 块都被评估),但是这些块之外的任何 javascript 都不会运行,直到客户端浏览器稍后运行它。例如,事件处理程序代码都是客户端的。

如果你确实需要运行客户端的库等,你可以用“老式”的方式来做:添加一个 javascript 资产,并从你需要运行它的文件链接到它,就像 jquery 等一样。因此,如果您的项目中有文件/assets/js/some_library.js,那么在 html 文件或视图中,您可以添加:

<script src="/js/some_library.js"></script>
<script>
    // your custom code here. You can often use
    // variables from the library here as you would
    // after "require"ing them in server-side code
</script>

Npm 可能是一个很难找到以这种方式使用的脚本的地方。有时您可以深入 npm 文件夹并在 libdist 文件夹中找到一个文件,您可以像我在上面使用的 some_library.js 一样使用它,但并非总是如此。对于您尝试从 npm 获取的任何功能,可能有一个更加面向浏览器的源代码。

希望这会有所帮助!

【讨论】:

  • 是的!这是比我以前看到的所有信息更有用的信息!我会努力的,看看我能不能让它工作!谢谢!
  • 你太棒了!首先尝试在控制器中,它工作!谢谢你的解释,现在我明白了我所有的错误XD
  • 在一切顺利之前不要太兴奋! :) 但很高兴能提供帮助。我记得这是 web-dev 的一个关键元素,不知何故从未向人们明确解释过。
猜你喜欢
  • 2016-12-24
  • 2018-06-24
  • 1970-01-01
  • 2021-03-24
  • 2021-08-20
  • 2014-05-04
  • 2011-05-23
  • 1970-01-01
  • 2017-05-05
相关资源
最近更新 更多