如何让它们工作 - npm 和 sails (html-pdf)

How get them to work - npm & sails (html-pdf)

编辑:好吧,我会保持简单,如果需要,我会在其他 post 中询问我的所有其他问题。最初的 post 太庞大了,希望有人能通过所有需要知道的指南来回答我,以充分利用风帆的潜力。对不起。

首先,我对 angular、npm 和 sails.js 很陌生,但我有很好的 Javascript 基础。

我对这些的所有了解都来自“Sails.js in Action”一书。

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

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

所以我通过 npm install html-pdf --save 安装了 html-pdf 包到我的 sails 项目中。然后只是为了测试它并让它工作,我使用了我当前空白的主页并添加了一些文本和一个 'save as 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'); 行给我一个错误(找不到变量:require)所以我后来尝试了一些更改。我找到了这个例子 并尝试更改代码以满足我的需要,但它也在代码的开头给了我一个错误(同样的错误,但我不再有那个改编)。

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

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

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

您放入 /assets/ 文件夹中的代码不同。这里的文件有 javascript 被发送(而不是 运行)到客户端机器上的浏览器和那里的 运行。 Npm 模块未设置为在那里工作。

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

如果您确实需要 运行 客户端的库等,您可以使用 "old fashioned" 方法:添加一个 javascript 资产,然后从 link 添加到它您需要 运行 的文件,与 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 获取的任何功能,可能有一个更面向浏览器的源代码。

希望对您有所帮助!