使用NPM模块创建一个Meteor应用
与版本0.6.0流星引入了NPM支持。但是完整的NPM支持只适用于流星包。只有流星使用的核心NPM模块才能从流星应用中加载。这意味着如果你需要使用像redis, github或winston这样的NPM模块,你就不走运了。但它是不是不可能。
最近,我想到了一个在流星中使用NPM的更聪明的方式。它被捆绑成一个智能包,非常容易使用。
在本教程中,我将指导您使用以下命令创建Github Issue Search应用程序githubNPM模块。我将一步一步地讲解如何构建它。但我想你应该很了解流星和陨石。
您可以看到实时应用程序http://gh-search.meteor.com代码是托管在github上。
创建应用程序
让我们创建应用程序。
MRT添加引导
我们不需要流星自动创建的文件,因此请确保删除以下文件。
高问题-搜索
让我们添加NPM支持
对于本教程,我们将使用github
NPM模块,它将被添加如下所示。
安装npm
来自大气层的智能包裹。
MRT添加NPM
创建packages.json
文件放在项目根目录下,并添加以下内容。
{"github": "0.1.10"}
packages.json
是我们定义要加载的NPM模块的文件。在声明版本时,请确保设置绝对版本号。类似的0.1.x
在Meteor中不起作用。
编写Meteor客户端
创建一个文件夹客户端
并添加以下HTML和CSS文件。我们不太担心这些文件,因为我们的重点是与NPM模块一起工作。
文件:客户机/ home
Github - Search title> {{> home}} <模板名称="home"> < h1>Github Issue Search
<输入类型="text" id= " user "占位符="Enter repo name "占位符="Enter repo name "值="meteor" b> <输入类型="text" id= " repo "占位符="Enter repo name "值="meteor">
<输入类型="text" id= " keyword "占位符="Enter Search keyword ">
{{> results}} <模板name = '结果' >{{#用错误}}< div class = '警告' >{{原因}}< / div >{{和}}{{#每个结果}}< div class = '结果' > < a href = ' {{html_url}} ' target =‘平等’>{{标题}}< / > < / div >{{/每个}}> < /模板
文件:客户机/ main.css
H1 {margin-top: 30px;} .result {padding: 10px 0px 10px 10px;边距:5px 0px 5px 0px;Border-left: 5px solid rgb(200,200,200);字体大小:16 px;}
文件:客户机/ helpers.js
Template.results。helpers({"results": function(){返回Session.get("results") || [];}, "error": function(){返回Session.get('error');}});
搜索结果和错误将通过会话变量呈现在模板中。我们所要做的就是设置会话变量,UI将相应地改变。
实现搜索
这就是我们将如何实现搜索。
- 我们将搜索作为一个Meteor方法来实现。
- Npm github模块将用于执行实际搜索。
- 搜索请求的详细信息(用户、存储库、搜索关键字)将从客户端发送到Meteor方法
Meteor.call
- 方法的结果(或错误)将在
Meteor.call
它将被设置为正确的会话变量。
监听按钮单击事件
我们将监听按钮点击事件文本字段值将被发送到方法搜索
。
文件:/客户/ events.js
Template.home。事件({“点击#搜索”:函数(){会话。设置(“错误”,null);会话。设置(“结果”,null);Var user = $('#user').val();Var repo = $('#repo').val();Var keyword = $('#keyword').val();$(" #搜索”). html(“搜索…”);Meteor.call('search', user, repo, keyword, function(err, results) { console.log(results); $('#search').html('Search Now'); if(err) { Session.set('error', err); } else { Session.set('results', results.issues); } }); } });
使用npm模块
现在是时候在服务器中实现我们的方法了。让我们创建一个名为服务器
并添加我们的方法,如下所示。
文件:服务器/ methods.js
### CodeBlock: 1流星。methods({"search": function(user, repo, keyword) {### CodeBlock: 2}});
标记为的地方
CodeBlock: x
将被替换为以下代码。
首先,让我们加载NPM模块。加载NPM模块通常是Npm.require ()
。中定义的模块packages.json
你需要使用Meteor.require ()
代替。
让我们加载Github模块CodeBlock: 1
var Github = Meteor.require(' Github ');var github = new github ({version: "3.0.0"});
让我们使用github npm模块进行搜索
但是等一下。NPM模块工作异步,但是Meteor方法可以工作同步。他们在一起玩得不好。
然而,npm
Smart package引入了另一个有用的方法Meteor.sync
这就解决了问题。让我们看看它是如何工作的。
此代码将添加到CodeBlock: 2
。
//这是搜索请求对象(由我们的github npm模块接受)var searchRequest = {user: user, repo: repo, keyword: keyword, state: 'open'};//执行暂停,直到done()回调被调用。var repos = Meteor.sync(函数(完成){github.search。issues(searchRequest, function(err, searchResults) {done(err, searchResults);});});if(rerepository .error){抛出新的流星。错误(401年,repos.error.message);} else{返回rest .result;}
Meteor.sync ()
将暂停流星方法的执行,直到(完成)
回调被触发。现在我们可以安全地在里面执行任何异步任务了Meteor.sync
。
得到结果(或错误)后,可以通过调用完成
回调。
(完成)
接受第一个参数作为错误对象,并接受第二个参数作为结果。然后将这些值作为的返回值发送给Meteor方法Meteor.sync ()
返回值被封装到一个对象中,如下所示。
{error: {error: "object"}, result: "resultValue"}
代码的另一部分不言自明。
下面是我们的最终代码。
var Github = Meteor.require(' Github ');var github = new github ({version: "3.0.0"});流星。method ({"search": function(user, repo, keyword) {var searchRequest = {user: user, repo: repo, keyword: keyword, state: 'open'};//执行暂停,直到done()回调被调用。var repos = Meteor.sync(函数(完成){github.search。issues(searchRequest, function(err, searchResults) {done(err, searchResults);});});if(rerepository .error){抛出新的流星。错误(401年,repos.error.message); } else { return repos.result; } } });
Showtime
让我们运行应用程序捷运
和http://localhost:3000
。托管版本可以在http://gh-search.meteor.com。
如果遇到任何错误,请尝试将其与github回购。
NPM模块并不局限于方法
我们可以在服务器的任何地方使用npm模块。当然,您可以在出版物、权限以及Meteor.sync
。
如果你不需要同步行为,只需要使用没有同步行为的NPM模块Meteor.sync
。没人能阻止你这么做。
我个人认为这对Meteor来说是一个很好的机会。从技术上讲,有30,000多个NPM模块等待与Meteor一起使用。
这是很大的潜力。