express里面VIEW支持多级express 项目目录结构构吗

node.js - express view cache acting funny - Stack Overflow
to customize your list.
Join the Stack Overflow Community
Stack Overflow is a community of 4.7 million programmers, just like you, helping each other.
J it only takes a minute:
I'm running into some funny stuff with the view cache in express/Jade. The controller fetches an article from MongoDB via Mongoose and hands it to the res.render function. However, after running for a couple of minutes Express starts serving the same compiled template for all requests to that route. This even happens to shared .jade includes that are used in various templates.
The database is fetching the correct articles and it doesn't matter if I pass some random strings to the template, I always get the same output.
This is the controller function:
exports.show = function(req, res) {
var articleId;
articleId = req.params.
Article.findOne({
_id: articleId
}).populate('author').exec(function(err, article) {
if (err) {
console.log(err);
res.render('articles/show', {
article: article,
articleId: article.id
And that's the route:
app.get('/articles/:id', articles.show);
The same things happen whether I'm running in production or development mode.
Has anyone run into this kind of toruble with Express/Jade?
Notice that express sets view cache enabled for production:
view cache Enables view template compilation caching, enabled in
production by default
Try adding this line in your app config section:
app.disable('view cache');
Also, try adding cache-control headers
res.setHeader('Cache-Control', 'no-cache');
res.render('articles/show', {
Cahce-Control
The Cache-Control general-header field is used to specify directives
that MUST be obeyed by all caching mechanisms along the
request/response chain. The directives specify behavior intended to
prevent caches from adversely interfering with the request or
response. These directives typically override the default caching
algorithms. Cache directives are unidirectional in that the presence
of a directive in a request does not imply that the same directive is
to be given in the response.
If you need a more advanced control, consider other fields like max-age,
is also a good resource, you'll see that different browsers may implement this rfc slightly different.
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you're looking for?
Browse other questions tagged
Stack Overflow works best with JavaScript enabledproductview express 高手进来讨论一下 - ProE技术讨论区 -
无维论坛 /模具和制造|产品和结构设计|机械工程师|手机设计的CAD/CAM/CAE专业论坛 - Powered by Discuz!
UID221282&帖子83&积分0&技术0 &真气90 &热诚0 &
productview express 高手进来讨论一下
使用productview express可以方便的查看PROE模型,但是在使用的时候会遇到以下问题,不知道大伙有没有解决
1,着色显示,productview express着色显示总是太亮了,亮的刺眼,亮的看的不舒服,能按PROE默认显示就好了。
2,旋转的问题,总是有点力不从心,转来转去老是难以达到自己想要的那个角度。
3,查看工程图不能按PROE默认的显示颜色显示。
总的说来就是都使用PROE里面的默认设置,这样才符合我们操作习惯。
不知道有没有办法设置这项?
附件: 您需要才可以下载或查看附件。没有帐号?
Always do your best ,what you plant now, you will harvest later!
UID203&帖子1263&积分334&技术30 &真气2813 &热诚17 &
这个只是个简化的版本,没有什么功能。
不过它的标准板,也没有什么多的功能,用它来做做插图还行。
UID278116&帖子2&积分0&技术0 &真气154 &热诚0 &
我在productview express 打开drw的图,结果显示是一片蓝色的,看不到图,请问是什么原因,盼指教,谢谢!
UID221282&帖子83&积分0&技术0 &真气90 &热诚0 &
我在productview express 打开drw的图,结果显示是一片蓝色的,看不到图,请问是什么原因,盼指教,谢谢!
Ivy 发表于
& & 你用的是什么版本的productview?
PROE又是什么版本的呢?
我这里是没有问题的,只是操作和颜色不好,没PROE里面方便和好看。
UID8646&帖子131&积分20&技术2 &真气67 &热诚0 &
从3楼发的图片上看来,productview可以实现带粗黑轮廓的显示,为什么PROE不也这样显示呢?为什么不把功能和优点统一一下啊?PROE的带边显示太垃圾了。太不清楚了!!!PTC的SB决策者。
UID221282&帖子83&积分0&技术0 &真气90 &热诚0 &
从3楼发的图片上看来,productview可以实现带粗黑轮廓的显示,为什么PROE不也这样显示呢?为什么不把功能和 ...
水壳鼠 发表于
& & 兄弟,别激动,你是不是SW或者UG用多了啊,那个黑边显示我并不觉得好看和方便区分零件边界。
UID278116&帖子2&积分0&技术0 &真气154 &热诚0 &
你用的是什么版本的productview?
PROE又是什么版本的呢?
我这里是没有问题的,只是操作和颜色 ...
yibaji 发表于
& & 我电脑是win7,64位系统,用的是Pro/E3.0,productview express9.1 ,*.prt的文件可以打开,*.drw的文件打开,就是显示不了,一片蓝色,如下图所示,不知道为什么,盼高人指教,谢谢!
附件: 您需要才可以下载或查看附件。没有帐号?
UID8646&帖子131&积分20&技术2 &真气67 &热诚0 &
兄弟,别激动,你是不是SW或者UG用多了啊,那个黑边显示我并不觉得好看和方便区分零件边界。
yibaji 发表于
可能大家习惯不同吧,SW和UG我都没用过,但是仍然觉得黑边显示很清楚,很好看,我现在看图画图时都是设置的带边显示,聊胜于无吧~~~~~~
[通过 QQ、MSN 分享给朋友]翻译:为什么你应该抛弃Express的视图渲染引擎 - CNode技术社区
Node Rocks!!
翻译自, 作者:Patrick Steele-Idem。你也可以到我的看本文。
Nodejs Express框架的一个被人们广为使用的特性是它的渲染引擎。Express视图渲染引擎允许Controller提供一个视图名称和视图模型对象给Express,然后返回由HTTP响应流输出的一些字节。基于为eBay的Nodejs技术栈提供支持所获得的经验,我们发现了这个方法的缺点并决定彻底的弃用它。我们这么做了之后,能明显看到页面加载速度的提升、更好的模块性以及开发者生产力的提高。本文将解释为什么你不应该使用Express视图渲染引擎,并提供一个推荐的替代方案。
Express视图渲染引擎
在解释Express视图渲染引擎的缺点之前,让我们先来快速的过一遍它的用法。首先你必须使用类似下面的代码来配置你的Express app:
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
第一行代码告诉Express在views目录下搜索所有模板,第二行则在这些模板上应用jade模板引擎。
配置好之后,你能在Controller中使用res.render(viewName, viewModel)方法来渲染视图,代码如下:
app.get('/', function (req, res) {
res.render('index', { title: 'Hey', message: 'Hello there!'});
这里面的机制是,Express将视图名称对应到模板文件的路径,使用关联的模板引擎来渲染模板,将结果输出到response,最后结束响应。
不好的地方
这个方法看起来如此简单,你可能从来没想过它会出错。但实际上它还是有不少问题,当出问题时会影响web程序性能和可维护性,下面我们讲到这些。
破坏模块性
Express强制性的要求设置一个views目录,所有模板都堆放在这里。本来你可以将模板放到Controller或使用这些模板的UI组件附近,现在你不得不将它们放到一个单独的顶级目录里。一个典型的基于Express的项目,它的目录结构将会与下面类似:
routes/
views/
login.jade
使用Express推荐的目录结构,你不得不将源码按照类型而非特性来分来。作为结果,紧密相关的文件将被分离到截然不同的目录树里面,这意味着如果你需要修改一个功能,你可能需要遍历整个项目的目录以修改不同的文件。在后面的替代方案里我会介绍一个更健康的、模块化的目录结构。
与Express高度耦合
当使用Express视图渲染引擎,意味着你在使用一个与Express高度耦合的特性。如果你想在客户端渲染一个模板呢?如何解析局部模板?如果你想切换到另一个web框架或者不使用框架呢?事实是,Express引入的这个解析和渲染模板的新方法,只能在服务端并且只能在Express中使用。当构建同构(isomorphic)web app时,我们希望在服务端和客户端使用更一致的渲染模板的方法。
没有Streaming
Express视图渲染引擎不支持streaming(流式传输),这对于客户端和服务端两方的性能都有负面影响。在服务端,当渲染一个HTML页面模板时,整个HTML输出都被当做一个超长的字符串存储在内存里,当整个HTML输出都构造完成之后,才开始向HTML响应里输出第一个字节。这是因为所有的视图引擎都必须使用回调来实现。而只有当整个HTML都被渲染完毕,回调才会被调用。不使用streaming来输出HTML,我们将浪费服务端的内存,以及增加客户端等待响应的时间。
使用streaming来传输响应的好处还包括,更早的发送页面的&head&部分,因此客户端能够更快的下载页面的CSS文件。为了感受streaming带来的好处,你需要使用支持streaming的模板引擎。此外,支持异步渲染的模板引擎(如、和)甚至能够在视图模型构造完成之前就输出响应,因此能带来更多的性能提升。
集中式的配置
并不是所有的配置都不好,但不必要的配置是不好的。如果应用不同的地方需要不用的配置,集中式的配置将引起冲突。比如,如果需要呢?Express的sub-apps能在一定程度上解决这个问题,但最好的办法的还是避免额外的配置。
Express将它自己描述为一个框架,那么绕过Express视图渲染引擎实际上还是很容易的。这将让开发者创造更灵活的、易理解的和更高性的应用。首先你必须理解一个重要的概念,res对象实际上是一个可写的HTTP响应流(尽管它已经被Express重度修改过),因此你能够直接向响应里输出:
app.get('/', function (req, res) {
res.write('Hello Frank');
res.end();
如果你想渲染一个jade模板到HTTP响应,你可以照下面做:
var templatePath = require.resolve('./template.jade');
var templateFn = require('jade').compileFile(templatePath);
app.get('/', function (req, res) {
res.write(templateFn({name: 'Frank'});
res.end();
这个方法比起res.render()有些啰嗦,但它很直观也更灵活。
注意:你可能注意到我们使用了来获得模板的绝对路径,这个模板和我们的Controller模块放在一起。
如果你的模板引擎支持输出到一个流,代码将会更简单。比如Marko模板引擎的代码如下:
var templatePath = require.resolve('./template.marko');
var template = require('marko').load(templatePath);
app.get('/', function (req, res) {
template.render({name: 'Frank'}, res);
视图解析程序
如果你觉得你的app需要使用视图解析程序(比如你需要为A/B测试使用不同的模板,或者根据用户的地区来确定模板),也有一个非常干净的解决办法。下面的代码假想了一个独立于Express的视图解析程序,它是如何根据名称和一些上下文(本例中是请求和当前目录)来解析视图模板的。
var myViewResolver = require('my-view-resolver');
app.get('/', function (req, res) {
var template = myViewResolver.resolve('hello', req, __dirname);
template.render({name: 'Frank'}, res);
使用一个明确的视图解析程序能让代码更容易理解,并提供更高的灵活度。
现在你可以不受只能有一个views目录的限制了。让我们来看看新的项目结构:
pages/
home/
template.marko
login/
template.marko
新的项目结构让关联的文件放在相同的目录,从此之后可以模块化的开发和维护项目了。
尽管Express是一个极简主义的框架,但也没有必要一定要使用它所有的特性。有些时候独立的模块能比它做得更好。Nodejs其中的一条指导原则就是“模块应该只做一件事并把它做好”,并且我认为Express将诸如视图渲染和路由这些特性分离开来会更好。我们已经看到Express 4.x里分离了不少核心的中间件,我认为还应该更进一步。也许我们根本不需要一个框架。也许我们只需要一些在一起工作良好的模块就行。
希望现在你对于绕过Express视图渲染的好处已经明了于心了,如果你想看看具体的示例,可以看这里的。这里还有更大型的可供参考,希望能对你有所帮助。
Express强制性的要求设置一个views目录
关于上面这一点我不认同,你一样可以把目录设在根目录爱怎么玩怎么玩。但是实际上按分类摆放文件的形式应该更符合逻辑或者语义一些。本来就应该逻辑和渲染分离,你又把他们放在一起是闹哪样。
至于所谓的前端渲染,那就更没有关系了。你就算把它单独罗列,怎么就破坏前端渲染了?说实话“新”的目录结构不是特别敢恭维的——至少是我的主观意见,模块化感觉不是这么个模块化的方法的。
没有 Streaming 这点倒是的确。
最后其实感觉原作者有些强拉硬扯,非要把这东西说得很不好,有些误导之嫌,好像是为了说它的渲染机制不好而说的。让新手理解渲染机制倒是真的,说真这样有点不应该了。不过有可能是我自己太唯心了,上面说得都是我个人的主观观点而已。
你说的也有道理,原作者说的模块化应该是项目的模块化吧,它这种结构用在小项目上的确有点怪怪的,但如果是非常大的项目,那么就很有必要按照功能来模块化了。
模块化也是建立在类型基础上的,不然杂糅起来很难看也不好扩展。
a再大点要考虑的不仅仅是模块化了,要开始服务化了。
没看出新的方案有啥不一样
做了一半的bigpipe,有点标题党了
哈哈,原来的标题气势太不足就自己给换了个。
在做一个Bigpipe渲染模块,基于Hogan(mustache)模板引擎,你会看到
function curry () {...}
var view = require('bigpipe').View(__dirname + '/tpl/page');
var app = require('express')();
var routes = require('./lib/routes');
var pool = require('mysql').createPool(...);
app.get('/product', curry(routes.index)(pool, view))
// 加入页面缓存
.option('/product.tpl', {
partial: {
header: '/header.tpl',
footer: '/footer.tpl'
options: {
relative_path: 'http://127.0.0.1',
title: 'Product',
css: require('bigpipe').css('/css/base.css', '/css/my.css'),
js: require('bigpipe').js('/js/jquery.js', 'async:/js/ttt.js')
.option('/store.tpl', {
partial: {
header: '/header.tpl',
footer: '/footer.tpl'
options: {
relative_path: 'http://127.0.0.1',
title: 'Store',
css: require('bigpipe').css('/css/base.css', '/css/store.css'),
js: require('bigpipe').js('async:/js/new.js')
// 模板预编译
require('bigpipe').compile(__dirname + '/tpl/pagelet', _dirname + 'public/js/pagelet.js');
exports.index = function (pool, view, req, res, next) {
// chunk渲染 
require('bigpipe').Bigpipe(view, res)
.page('/product.tpl')
.pagelet('product-list', '/product/list.tpl', function (fill) {
pool.query('select * from tb', function (err, result) {
fill(result);
.pagelet('msg', '/msg.tpl', function (fill) {
pool.query('select * from msg', function (err, result) {
fill(result);
有点标题党的意思, 非常庞大的项目,这种设置是比较束缚。
但是换言之,庞大的项目,早就该拆分,各模块独立发布了
谢谢分享,学习了,不过我觉得原作者并不是想实现一个bigpipe,他只是想绕过Express中的render从而提高一些性能,同时获得一些便利。不过项目如果再大一些可能就要bigpipe了。
:没错,views目录的说法有点扯,spring mvc用了那么多年,也没见controller跟jsp放一块过。同样赞同流式传输的观点。
个人感觉应该纯粹将服务器当成一个内容提供者,网页构建全部让前端做,服务器只提供零件,充分利用浏览器的计算能力,给服务器减压
这。。你已经跳出大家在讨论的点了
他们是在讨论用哪个渲染框架吗?@@
模板分开放,有利用团队svn开发 比如程序员只修改程序,美工来调页面,如果放在一个目录下,这个种适合全栈(+美工)程序员 ,这样的能招到几个?
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的自动生成目录结构 - [ ThinkPHP5.0完全开发手册 ] - 看云
ThinkPHP5.0 具备自动创建功能,可以用来自动生成需要的模块及目录结构和文件等,自动生成主要调用\think\Build类库。
生成规则定义
首先需要定义一个用于自动生成的规则定义文件,通常命名为build.php。
默认的框架的根目录下面自带了一个build.php示例参考文件,内容如下:
// 生成运行时目录
'__file__' =& ['common.php'],
// 定义index模块的自动生成
'__file__'
=& ['common.php'],
=& ['behavior', 'controller', 'model', 'view'],
'controller' =& ['Index', 'Test', 'UserType'],
=& ['index/index'],
// 。。。 其他更多的模块定义
可以给每个模块定义需要自动生成的文件和目录,以及MVC类。
__dir__ 表示生成目录(支持多级目录)
__file__ 表示生成文件(不定义默认会生成 config.php 文件)
controller 表示生成controller类
model表示生成model类
view表示生成html文件(支持子目录)
自动生成以APP_PATH为起始目录,__dir__ 和 __file__ 表示需要自动创建目录和文件,其他的则表示为模块自动生成。
模块的自动生成则以 APP_PATH.'模块名/' 为起始目录。
并且会自动生成模块的默认的Index访问控制器文件用于显示框架的欢迎页面。
我们还可以在APP_PATH目录下面自动生成其它的文件和目录,或者增加多个模块的自动生成,例如:
'__file__'
=& ['hello.php','test.php'],
// 定义index模块的自动生成
'__file__'
=& ['tags.php', 'user.php', 'hello.php'],
=& ['behavior', 'controller', 'model', 'view'],
'controller' =& ['Index', 'Test', 'UserType'],
=& ['index/index'],
// 定义test模块的自动生成
['behavior','controller','model','widget'],
'controller'=&
['Index','Test','UserType'],
['User','UserType'],
['index/index','index/test'],
命令行自动生成
我们通过控制台来完成自动生成,切换到命令行,在应用的根目录输入下面命令:
&php think build
如果看到输出
则表示自动生成成功。
默认会读取应用目录application下面的build.php 作为自动生成的定义文件,如果你的定义文件位置不同,则需要使用--config参数指定如下:
&php think build --config build.php
表示读取根目录下的build.php文件。
生成模块指令
&php think build --module test
表示自动生成test模块。
添加自动生成代码
如果你不习惯命令行操作,也可以直接调用\think\Build类的方法进行自动生成,例如:
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
// 读取自动生成定义文件
$build = include 'build.php';
// 运行自动生成
\think\Build::run($build);
run方法第二个参数用于指定要生成的应用类库的命名空间,默认是app,第三个参数是设置是否需要使用类后缀。
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
// 读取自动生成定义文件
$build = include 'build.php';
// 运行自动生成
\think\Build::run($build,'application',true);
可以不依赖自动生成文件,直接使用默认目录生成模块,例如:
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
// 自动生成admin模块
\think\Build::module('admin');
module方法第二个参数和第三个参数的用法和run方法一样。
页面正在加载中node——解析express - 简书
下载简书移动应用
写了16584字,被9人关注,获得了25个喜欢
node——解析express
参考视频:
(科学上网大法)
首先,新建一个node.js Express App,取个项目名叫megan,然后就自动生成了项目目录。看看这个目录的结构先。
Express项目组织目录结构
依次讲一下这个结构。
入口:bin/www是入口文件,创建一个服务器,默认监听3000端口,并引入app.js,将它作为该服务器的回调函数。
当客户端连接到服务器:
执行app.js里stack里这些注册好的中间件——粗暴的讲,就是服务器接收请求后,执行app, app去处理这个'/'的请求。
app.js是怎么处理的呢,它发现有内部有对应该请求的响应(确实有,就是app.use('/', routes);注册的呀),就根据注册的这一条stack,去找到对应的routes目录的地方执行里面的内容(index.js)
执行route,它里面的代码到底是什么呢?是这样的:拿到浏览器端页面'/',写该页写响应(给客户端的响应),具体就是渲染模板, 向客户端写html代码,根据view目录下的模板渲染该html页。
不妨看看route目录下的index.js代码
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
module.exports =
短短几行代码很简单,就是拿到客户端页面, 然后渲染html。补充一句,res.render('index', { title: 'Express' });第一个参数index是表示view/index.html,用来指定是哪一个html模板。好了,这是express服务器和客户端的通信部分,从连接到收到请求,到处理请求,渲染模板。那么,回到具体的项目本身,我们自己的代码又放在哪里怎么写呢?——Public目录。
我们项目自己的样式,js文件,和图片都放在public目录下的文件夹里。而html页的模板,则放在view目录下,客户端对服务器的请求通信,服务器根据请求渲染页面这件事,则是交给了route目录,简单说,我们构建项目的时候,要在app.js文件中使用app.use注册好应对客户端不同请求的中间件,即路由功能,起到分发作用,客户端发送了一个请求,app.js回去内部找有没有定义响应的中间件,有的话,就根据路径交给路由,路由route的代码里会去处理这个请求,比如像上面这段代码这样,渲染客户端页面。注意一件事,就是route目录和views目录,默认俩目录里面的文件名字是对应的,也就是同名对应。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
如果你是程序员,或者有一颗喜欢写程序的心,喜欢分享技术干货、项目经验、程序员日常囧事等等,欢迎投稿《程序员》专题。
专题主编:小...
· 176195人关注
有关编程方面的资料
· 89人关注
一起来学ES6吧!
· 20人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 java ftp创建多级目录 的文章

 

随机推荐