如何让它们工作 - 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 文件夹并在 lib
或 dist
文件夹中找到一个文件,您可以像我在上面使用 some_library.js
一样使用它,但并非总是如此。对于您尝试从 npm 获取的任何功能,可能有一个更面向浏览器的源代码。
希望对您有所帮助!
编辑:好吧,我会保持简单,如果需要,我会在其他 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 文件夹并在 lib
或 dist
文件夹中找到一个文件,您可以像我在上面使用 some_library.js
一样使用它,但并非总是如此。对于您尝试从 npm 获取的任何功能,可能有一个更面向浏览器的源代码。
希望对您有所帮助!