错误:在node.js上渲染灰尘模板时找不到'dust'模块

时间:2015-03-22 01:16:59

标签: node.js express dust.js

我开始使用样板代码表达式为我生成。我需要dustjs-linkedin并在app.js中编译一些简单的模板,如下所示:

var dust = require('dustjs-linkedin');...

app.set('view engine', 'dust');...

var compiled = dust.compile("Hello {name}!","intro");
// add into dust.cache manually
dust.loadSource(compiled);
console.log(dust.cache);

dust.render("intro", {name: "Fred"}, function(err, out) {
  if(err){console.log(err)}
  console.log(out);
});

这一切都很好,我看到终端输出的HTML。只有当我在开始出现此错误时尝试从路径中执行相同的操作时才会出现:

GET / 500 11.607 ms - 904 Error: Cannot find module 'dust'

app.get('/', function(req, res){
  var compiled = dust.compile("Hello {name}!", "intro");
  dust.loadSource(compiled)
  dust.render("intro", {name: "Fred"}, function(err, out) {
    console.log(out);
    res.send(out);
    res.close();
  });
});

这都在app.js范围内,只有在路线之外才有效,但在我将其移动到路线回调时却不行。有谁知道为什么它找不到灰尘'?我已经要求它,它应该在回调权中可见吗?

感谢您的帮助!

修改1 根据下面的评论,'尘埃'在某个地方需要。我没有在我的代码中这样做;我的猜测是Express正在幕后进行,因为我的模板已经有了#d; .dust'文件结束。我只是尝试删除我的所有模板(不管怎样都不使用它们)现在我只是得到了这个错误:

Error: Failed to lookup view "error" in views directory

我想要的只是看输出:" Hello Fred"

编辑2:我认为我发现了什么错误

发布的所有 Interrobang 都是正确的。我认为,问题在于这个中间件块是由快速生成器为我生成的:

app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

因此,对于每个请求,此中间件都会触发并抛出错误。我不是100%确定它在做什么,但如果我发表评论,一切正常。我现在的第二个问题,如果我可能有一个问题,究竟是怎么回事?为什么要为所有请求设置?

1 个答案:

答案 0 :(得分:4)

您已将view engine设置为dust,但您还没有使用Express注册引擎,告诉它如何渲染Dust--而且Express不能默认情况下这样做。

考虑使用consolidatehoffmanadaro(以及其他)作为Express的Dust渲染引擎。

这是一个使用合并的完整示例。我已经测试过,这可以在我的机器上运行。

var express = require('express'),
    cons = require('consolidate'),
    app = express();

// assign the dust engine to .dust files 
app.engine('dust', cons.dust);

// set .dust as the default extension 
app.set('view engine', 'dust');
app.set('views', __dirname + '/views');

app.get('/', function(req, res) {
    res.render('index', { name: 'Interrobang' });
});

app.listen(3000, function () {
  console.log('Visit http://localhost:3000 woo!');
});

或者,只需从代码中删除view engine行即可。您没有使用Express进行渲染,因此Express甚至不需要知道。

这是一个非常简单的示例,没有任何我已经测试过的视图引擎。您的Dust模板位于名为views的文件夹中。

var fs = require('fs'),
    path = require('path'),
    express = require('express'),

    dust = require('dustjs-helpers');

dust.config.whitespace = true;

dust.onLoad = function(tmpl, cb) {
  fs.readFile(path.join('./views', path.resolve('/', tmpl + '.dust')),
              { encoding: 'utf8' }, cb);
};

var app = express();
app.get('/', function (req, res) {
  dust.stream("hello", { "world": "World!" }).pipe(res);
});

app.listen(3000, function () {
  console.log('Visit http://localhost:3000 woo!');
});