express视图助手dynamicwin10helpersvr.exe和win10helpersvr.exe从2.x到3.x改成什么了

《nodejs开发指南》微博实例express4.x版
《nodejs开发指南》微博实例express4.x版
之前一直执着于前端开发,最近几天,开始学期了 nodejs
。作为一名前端开发者,见到这样一门用 javascript
写的后台自然是很激动的。但是,后台毕竟不同于前端,在学习的过程中,还是会遇到不少问题。
为了开始学习 nodejs ,一开始选择了《深入浅出
nodejs 》这本书,看了几章之后,得出一个结论是:真是一本好书,但是还是不会写
nodejs !然后选择了另外一本教材《 nodejs
开发指南》,由于看过了《深入浅出 nodejs
》,直接跳过了这本书的前几章,写起了该书第五章的微博实例。作为一个新手,在写的过程中,才逐渐发现因为
版本升级的原因,书中的代码很多已经不能用了,这对于新手来讲,真是痛苦的经历!!本着分享和学习的精神,特此奉上《
nodejs 开发指南》微博实例 express4.x
版本源码和编写过程中需要注意的问题。
首先我们看看当前 express 的版本:
这和书本所用的 express2.x 版本已经有了很大的变化。对于
express4 版本的新特性,可以看看这个:
话不多说,我们开始我们创建项目之旅。
首先我们新建一个文件夹,用 cmd
进入文件夹,准备创建项目。按照书中提到的,创建项目的命令应该是:
1 express -t ejs microblog
问题是express&-t参数已经失效,最新的express版本的默认模板引擎是jade,所以为了使用ejs,我们需要像下面这样创建项目:
1 express -e ejs microblog
按照书中所说的,我们直接运行代码:
1 supervisor app.js
并且在浏览器中输入http://localhost:3000/,并不能看到书中需要的效果,而是需要在app.js中app.use('/',&routes);后面添加:
<span STYLE="CoLor: # app.listen(3000);
<span STYLE="CoLor: # Console.log(something happening);
按照书中的步骤往下走,我们会发现一个问题,因为在views文件夹里面不是layout.ejs和index.ejs,这是因为,最新版本的express不支持ejs模块的partials方法,所以需要自己额外安装模块:
1 npm install express-partials
然后在 app.js 中添加:
var partials = require('express-partials');
app.use(partials());
需要注意的是,这一行要添加到app.set('view&engine',&'ejs');后面,如果添加到app.use('/',&routes);后面,会出现css引用失败的现象,博主还不明白原因。
这时候就可以在views中新建文件layout.ejs,然后复制书中112页的layout.ejs代码到我们新建的文件上面。然后运行代码,就能看到下面的效果了:
以上的步骤都不算什么问题,问题就出在连接数据库的一系列问题!如下所述:
为了执行下面的操作,我们首先需要安装MongoDB数据库,博主推荐这篇博客:
看了不少安装 MongoDB 的博客,这个是博主见过最有效的。
对于新版本的express,按照书本上那样连接数据库会报错,连接数据库需要的文件时
settings.js, 这个按照书上的来没有问题,但是
models 中的 db.js
需要做一些改动。如果按照书中的代码:
<span STYLE="CoLor: # var settings = require('../settings');
<span STYLE="CoLor: # var Db = require('mongodb').Db;
<span STYLE="CoLor: # var Connection = require('mongodb').C
<span STYLE="CoLor: # var Server = require('mongodb').S
<span STYLE="CoLor: # module.exports = new Db(settings.db, new Server(settings.host, Connection.DEFAULT_
<span STYLE="CoLor: # PORT, {}));
可能会出现下面的问题:
博主 google 之后,才发现需要按照下面的格式书写:
<span STYLE="CoLor: # var settings = require('../settings'),
<span STYLE="CoLor: #
Db = require('mongodb').Db,
<span STYLE="CoLor: #
Connection = require('mongodb').Connection,
<span STYLE="CoLor: #
Server = require('mongodb').S
<span STYLE="CoLor: # module.exports = new Db(settings.db, new Server(settings.host, Connection.DEFAULT_PORT, {}), {safe: true});
在引用 settings 模块的时候,如果按照书中的:
<span STYLE="CoLor: # var settings = require('../settings');
这是因为最新的 express 版本中需要这样引用这个模块:
<span STYLE="CoLor: # var settings = require('./settings');
但是解决了这个问题之后,相继出现了下面这个令人蛋疼的情况:
一开始我也是琢磨不透,但是 google 的时候,有一个哥们做了很好的解答:
也就是说 , 在 express4
中我们需要自己安装 express-session
包,然后添加引用:
<span STYLE="CoLor: # var session
= require('express-session');
原来的数据库引用也需要改成:
<span STYLE="CoLor: # var MongoStore = require('connect-mongo')(session);
而这些代码:
<span STYLE="CoLor: # app.use(express.session({
<span STYLE="CoLor: #
secret: settings.cookie_secret,
<span STYLE="CoLor: #
store:new MongoStore({
<span STYLE="CoLor: #
db: settings.db
<span STYLE="CoLor: #
<span STYLE="CoLor: # }));
就需要改写成:
<span STYLE="CoLor: #
app.use(session({
<span STYLE="CoLor: #
secret: settings.cookie_secret,
<span STYLE="CoLor: #
store: newMongoStore({
<span STYLE="CoLor: #
db : settings.db,
<span STYLE="CoLor: #
<span STYLE="CoLor: #
对于书中提到的视图交互,原本的代码是:
1 app.dynamicHelpers({
user: function(req, res) {
return req.session.
error: function(req, res) {
var err = req.flash('error');
if (err.length)
<span STYLE="CoLor: #
return null;
<span STYLE="CoLor: #
<span STYLE="CoLor: #
success: function(req, res) {
<span STYLE="CoLor: #
var succ = req.flash('success');
<span STYLE="CoLor: #
if (succ.length)
<span STYLE="CoLor: #
<span STYLE="CoLor: #
<span STYLE="CoLor: #
return null;
<span STYLE="CoLor: #
<span STYLE="CoLor: # });
在最新版本的 express 中需要改成:
1 app.use(function(req, res, next){
console.log("app.usr local");
res.locals.user = req.session.
res.locals.post = req.session.
var error = req.flash('error');
res.locals.error = error.length ? error : null;
var success = req.flash('success');
res.locals.success = success.length ? success : null;
<span STYLE="CoLor: #
<span STYLE="CoLor: # });
注册页面中用到了 flash ,但是最新版本的
express 已经不支持 flash 了,你需要先使用
npm&install&
。然后在 app.js
中添加如下代码:
1 app.use(flash());
接下来按照书上的步骤走,基本不会出问题了,最后我们就能得到我们想要的效果啦~:
需要说明一下的是,跟着书本写这个小应用的时候,出现了很多问题,也就是上面遇到的很多问题,但是博主都是本着自主研究的精神不断google,终于跳出神坑,得到了最后的效果,希望看到这篇博客的朋友好好研读,也好好看看下面的链接,里面很可能也是你遇到的问题,如果你在跟着书本编写代码的过程中遇到了问题,欢迎一起交流~
最后,附上最终版本的源码:/yuanzm/microblog,欢迎Fork~
本文主要用到的资料如下:
http://cnodejs.org/topic/516f6d326dea7a5
.cn/s/blog_cmwm.html
/meteoric_cry/archive//2604890.html
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1847人阅读
有效的HTML和XHTML文档应当包括一个&DOCTYPE&声明。但是文档类型声明很难记忆,而且会影响到文档中的特定元素的解析(例如,在&&script&&和&&style&&元素中转义的CDATA)。
Doctype&助手允许指定下列类型之一:
XHTML1_STRICT
XHTML1_TRANSITIONAL
XHTML1_FRAMESET
XHTML_BASIC1
HTML4_STRICT
HTML4_LOOSE
HTML4_FRAMESET
你也可以指定一个自己定制的带有良好结构的文档类型。
Doctype助手是&的一个具体的实现。
在任何时候都可以指定 doctype。然而,依赖 doctype 输出的助手只在你设置后才认识它,所以最简单的用法是在 bootstrap 脚本中指定:
$doctypeHelper = new Zend_View_Helper_Doctype();
$doctypeHelper-&doctype('XHTML1_STRICT');
然后在布局脚本中输出:
&?php echo $this-&doctype() ?&
如果需要知道文档类型,可以在由调用助手返回的对象中调用getDoctype()。
$doctype = $view-&doctype()-&getDoctype();
很常见地,你需要知道doctype是否XHTML;那么,isXhtml()方法已经足够:
if ($view-&doctype()-&isXhtml()) {
// do something differently
HTML的&&link&&标签越来越多地用于为你的站点链接不同资源:stylesheet, feed, favicon, trackback等。HeadLink&助手提供了一个简单的接口用来创建和聚合这些元素以供稍后在你的布局脚本里获取和输出。
HeadLink&助手有以下特殊的方法用来添加 stylesheet 链接:
appendStylesheet($href, $media, $conditionalStylesheet)
offsetSetStylesheet($index, $href, $media, $conditionalStylesheet)
prependStylesheet($href, $media, $conditionalStylesheet)
setStylesheet($href, $media, $conditionalStylesheet)
$media&&#20540;缺省为 'screen',但可以为任何有效的媒体(media)&#20540;。$conditionalStylesheet&是布尔&#20540;,将用于解析时来决定是否有特殊的注释应该被包括以防止在特定的平台上加载stylesheet。
另外,HeadLink&助手有特殊的方法用来添加 'alternate' 链接到它的堆栈:
appendAlternate($href, $type, $title)
offsetSetAlternate($index, $href, $type, $title)
prependAlternate($href, $type, $title)
setAlternate($href, $type, $title)
headLink()&助手方法允许指定所有的必要的属性给&&link&&元素, 也允许指定替代 - 是否新元素替换所有其他的,前置(栈顶),或追加(栈底)。
HeadLink&助手是&的一个具体实现。
任何时候可以指定headLink,典型地,将在布局脚本里指定全局链接,并在应用程序视图脚本里指定特定的链接。在布局脚本里的 &head& 部份,用echo来输出。
&?php // 在视图脚本中设置链接:
$this-&headLink()-&appendStylesheet('/styles/basic.css')
-&headLink(array('rel' =& 'favicon', 'href' =& '/img/favicon.ico'), 'PREPEND')
-&prependStylesheet('/styles/moz.css', 'screen', true);
&?php // 解析链接:?&
&?= $this-&headLink() ?&
HTML&&meta&元素用来提供关于HTML文档的 meta 信息-如关键字,文档字符集,缓冲的 pragama 等。Meta标签可以是'http-equiv' 或 'name' 类型,必须包含'content'属性,并且也可以有 'lang' 或 'scheme' 修饰属性。
HeadMeta&助手提供下列方法来设置和添加 meta 标签:
appendName($keyValue, $content, $conditionalName)
offsetSetName($index, $keyValue, $content, $conditionalName)
prependName($keyValue, $content, $conditionalName)
setName($keyValue, $content, $modifiers)
appendHttpEquiv($keyValue, $content, $conditionalHttpEquiv)
offsetSetHttpEquiv($index, $keyValue, $content, $conditionalHttpEquiv)
prependHttpEquiv($keyValue, $content, $conditionalHttpEquiv)
setHttpEquiv($keyValue, $content, $modifiers)
$keyValue&参数用来定义'name'的&#20540;或'http-equive'键;$content&是'content' 键的&#20540;,$modifiers&是可选的包含'lang' 和/或 'scheme'键的联合数组。
也可以用&headMeta()&助手方法来设置 meta 标签:headMeta($content, $keyValue, $keyType = 'name', $modifiers = array(), $placement = 'APPEND')。$keyValue&是指定在&$keyType&里的键的内容,$keyType&应该是'name'
或 'http-equiv'。$placement&可以是 'SET' (覆盖所有先前存储的&#20540;), 'APPEND' (添加到栈尾)或 'PREPEND'(添加到栈顶)。
HeadMeta&覆盖每个&append()、offsetSet()、&prepend()&和&set()&来加强上面列出的特殊方法的用法。在内部,它存储每个条目为&stdClass&令牌,它稍后用&itemToString()&方法来序列化。这允许在堆栈的条目中执行检查,并可选地通过修改对象返回来修改这些条目。
HeadMeta助手是&的一个具体实现。
你可以在任何时候指定一个新的meta标签。例如指定客户端缓冲规则或SEO关键字。
例如,如果想指定SEO关键字,要创建带有名为'keywords'和内容(在页面上和关键字有关联的)的meta名称标签:
&?php // setting meta keywords
$this-&headMeta()-&appendName('keywords', 'framework php productivity');
如果想设置一些客户端缓冲规则,最好设置带有想执行的规则的 http-equiv 标签:
&?php // 禁止客户端缓存
$this-&headMeta()-&appendHttpEquiv('expires', 'Wed, 26 Feb :57 GMT')
-&appendHttpEquiv('pragma', 'no-cache')
-&appendHttpEquiv('Cache-Control', 'no-cache');
meta标签的另一个流行用法是设置内容类型,字符集和语言:
&?php // setting content type and character set
$this-&headMeta()-&appendHttpEquiv('Content-Type', 'text/ charset=UTF-8')
-&appendHttpEquiv('Content-Language', 'en-US');
最后一个例子,可以使用&meta refresh& 来让页面转向,一个简单的办法来显示过渡消息:
&?php // 设置以下meta可使页面3秒钟后转向一个新的url
$this-&headMeta()-&appendHttpEquiv('Refresh', '3;URL=http://www.some.org/some.html');
在布局脚本(layout)中放置所有meta标签后,简单地echo助手,把所有内容输出:
&?= $this-&headMeta() ?&
HTML&&script&&元素用来提供内嵌的客户端脚本元素或链接到远程包含客户端脚本代码的资源。你可以用HeadScript&助手来管理它们。
HeadScript&助手支持下列方法来设置和添加脚本:
appendFile($src, $type = 'text/javascript', $attrs = array())
offsetSetFile($index, $src, $type = 'text/javascript', $attrs = array())
prependFile($src, $type = 'text/javascript', $attrs = array())
setFile($src, $type = 'text/javascript', $attrs = array())
appendScript($script, $type = 'text/javascript', $attrs = array())
offsetSetScript($index, $script, $type = 'text/javascript', $attrs = array())
prependScript($script, $type = 'text/javascript', $attrs = array())
setScript($script, $type = 'text/javascript', $attrs = array())
对于所有*File()方法,$src&是要加载的脚本的远程位置,常常以 URL 或路径的形式表示。 对于所有*Script()方法,$script是客户端你想用于元素中的脚本。
HeadScript也允许抓取脚本,然后放到其它地方,如果你想通过程序生成客户端脚本,这将很有用。下面的例子里有它的用法。
最后,你也可以用&headScript()方法 来快速地添加脚本元素,它的用法是:&headScript($mode = 'FILE', $spec, $placement = 'APPEND')。$mode&是指链接一个文件还是一个脚本,可以是'FILE' 或 'SCRIPT' ,$spec&是链接的脚本文件或脚本代码。$placement必须为'APPEND',
'PREPEND', 或'SET'其中之一.
HeadScript&覆盖&append(),&offsetSet(),prepend()&和&set()&中的每一个来加强上述特殊方法的用法。在内部,它存储每个条目为&stdClass&令牌,它在稍后用itemToString()&方法
serializes 。这允许在堆栈里检查条目,并可选地通过修改返回的对象来修改这些条目。
The&HeadScript&助手是&的一个具体实现。
Note:&当包含脚本内嵌在 HTML&body里时,应当使用HeadScript&的兄弟助手,。为了加速页面的加载,提高用户访问速度,特别是当使用第三方分析脚本(比如Google Analytics等流量统计系统的javascript文件 --Haohappy注),把脚本放在文档的最后是一个好的习惯。&
Note:&缺省地,HeadScript&将只解析(render)由 W3C 赋予的&&script&&属性,包括 'type'、 'charset'、 'defer'、 'language' 和 'src' 。 然而,一些 javascript 框架,如,利用定制的属性来修改行为。为了允许这样的属性,可以通过&setAllowArbitraryAttributes()&方法来打开(enable)它们:&
$this-&headScript()-&setAllowArbitraryAttributes(true);
在任何时候可以指定一个新的脚本。如上所述,可以链接到外部资源文件或脚本自己。
&?php // adding scripts
$this-&headScript()-&appendFile('/js/prototype.js')
-&appendScript($onloadScript);
在客户端脚本编程中,顺序常常很重要,因为依赖的缘故,需要确保按特定的顺序来加载库,使用 append、 prepend 和 offsetSet 指令来帮助完成任务:
&?php // 按顺序放置脚本文件
//设置偏移量来确保这个文件最后加载
$this-&headScript()-&offsetSetScript(100, '/js/myfuncs.js');
//使用scriptaculous效果文件,这时append动作使用索引101,接上行代码的索引
$this-&headScript()-&appendScript('/js/scriptaculous.js');
//但总是保证prototype文件首先加载
$this-&headScript()-&prependScript('/js/prototype.js');
当准备好输出所有脚本到布局脚本,简单地 echo 这个助手:
&?= $this-&headScript() ?&
有时候,需要“编程式”地生成客户端脚本。你可以使用字符串串联、heredoc或类&#20284;的技术(字符串串联即$string1.$string2这种形式,heredoc即使用&&&操作符--Haohappy注),通常通过创建脚本和在PHP标签里做手脚会更容易些。HeadScript&可以实现这个功能,把一段JavaScript代码抓取到堆栈中暂存(道理同缓冲输出--Haohappy注):
&?php $this-&headScript()-&captureStart() ?&
var action = '&?= $this-&baseUrl ?&';
$('foo_form').action =
&?php $this-&headScript()-&captureEnd() ?&
下面是上例中的一些假设:
脚本将追加到堆栈。如果需要替换或者追加到堆栈顶部,那么需要分别把 'SET' 或 'PREPEND' 作为第一个参数传递给&captureStart()&。
脚本 MIME 类型假定为 'text/javascript',如果想指定一个不同的类型,需要把它作为第二个参数传递给&captureStart()&。
如果需要为&&script&&标签指定附加属性, 把它们放入数组作为第三个参数传递给&captureStart()&。
在 HTML&&head&&元素中 HTML&&style&&元素用来包含 CSS stylesheets inline 。
Note:&&为包含外部 stylesheets 应该用来生成&&link&&元素。如果想定义自己的 stylesheets inline, 使用&HeadScript&。&
HeadStyle&助手支持下列方法来设置和添加 stylesheet 声明:
appendStyle($content, $attributes = array())
offsetSetStyle($index, $content, $attributes = array())
prependStyle($content, $attributes = array())
setStyle($content, $attributes = array())
对于所有情况,$content&是实际上的 CSS 声明。$attributes&是提供给&style&标签的任何额外的属性:lang、 title、 media 或 dir 都是允许的。
HeadStyle&也允许抓取样式声明,如果想用程序生成声明,然后在任何地方自由使用,这很有用。这个用法将在下面的例子给出。
最后,你也可以用&headStyle()方法 来快速地添加声明元素,它的用法:&headStyle($content$placement = 'APPEND', $attributes = array())&。$placement&是 'APPEND'、 'PREPEND' 或 'SET'。
HeadStyle&覆盖&append(),&offsetSet(),prepend()&和&set()&中的每一个来加强上述特殊方法的用法。 在内部,它存储每个条目为&stdClass&令牌,它在稍后用itemToString()&方法
serializes 。这允许在堆栈里检查条目,并可选地通过修改返回的对象来修改这些条目。
HeadStyle&助手是&的一个具体实现。
在任何时候都可以指定一个新的样式标签:
&?php // adding styles
$this-&headStyle()-&appendStyle($styles);
对 CSS 来说,顺序非常重要,因为层叠的顺序(the order of the cascade),你需要确保样式表中的声明按特定的顺序加载。使用append、 prepend 和 offsetSet 指令可帮助你达到目的:
&?php // Putting styles in order
// place at a particular offset:
$this-&headStyle()-&offsetSetStyle(100, $customStyles);
// place at end:
$this-&headStyle()-&appendStyle($finalStyles);
// place at beginning
$this-&headStyle()-&prependStyle($firstStyles);
当准备好在布局脚本里输出所有样式声明,简单地 echo 助手:
&?= $this-&headStyle() ?&
有时候需要用程序生成 CSS 样式声明。当你可以使用字符串串联,heredoc等等, 通常通过创建脚本和在PHP标签里做手脚会更容易些。HeadStyle&可以做这个,把它抓取到堆栈:
&?php $this-&headStyle()-&captureStart() ?&
background-color: &?= $this-&bgColor ?&;
&?php $this-&headStyle()-&captureEnd() ?&
下面是一些假设:
样式声明将追加到堆栈。如果需要替换或者加到堆栈顶部,那么需要分别把 'SET' 或 'PREPEND' 作为第一个参数传递给&captureStart()&。
如果想指定任何另外的属性给&&style&&标签,通过数组把它们作为第二个参数传递给&captureStart()&。
HTML&&title&&元素用来提供标题给HTML文档。HeadTitle&助手允许用程序生成和存储标题供以后解析和输出。
HeadTitle&助手是&的一个具体实现。 它覆盖&toString()&方法来确保生成&&title&&元素,并添加一个&headTitle()&方法来快速并容易地设置和标题元素的聚合。那个方法的
signature 是&headTitle($title, $setType = 'APPEND'),缺省地是追加到堆栈(聚合标题元素)的&#20540;,但你也可以指定 'PREPEND' ( 放栈顶 ) 或 'SET' ( 重写堆栈 )。
你可以在任何时候指定一个标题标签。一般的用法可以让你在应用程序的每一个层次来设置标题段:站点、控制器、动作和潜在的资源。
// setting the controller and action name as title segments:
//把控制器和动作的名称设置为标题的一部分
$request = Zend_Controller_Front::getInstance()-&getRequest();
$this-&headTitle($request-&getActionName())
-&headTitle($request-&getControllerName());
// setting t possibly in the layout script:
//添加标题内容,这种写法常用于布局脚本中
$this-&headTitle('Zend Framework');
// setting a separator string for segments:
//为标题的各部分设置分隔符
$this-&headTitle()-&setSeparator(' / ');
在布局脚本中准备好标题后,使用echo即可输出:
&!-- renders &action& / &controller& / Zend Framework --&
&?= $this-&headTitle() ?&
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:646071次
积分:9222
积分:9222
排名:第875名
原创:288篇
转载:28篇
评论:63条
文章:57篇
阅读:102137
文章:45篇
阅读:215822
(2)(1)(11)(14)(1)(1)(2)(1)(1)(1)(1)(6)(4)(3)(7)(5)(6)(5)(13)(7)(19)(13)(35)(92)(12)(6)(3)(5)(15)(9)(2)(11)(5)(1)(1)

我要回帖

更多关于 win10helpersvr.exe 的文章

 

随机推荐