Yeoman subgenerator无法读取null的属性'toString'

时间:2015-03-03 16:49:39

标签: node.js yeoman-generator

我正在创建一个Yeoman Generator,直到这一点一直正常工作。我的index.js在我的app文件夹中正确运行,生成初始结构。在该文件中,我经常使用this.fs.copy()this.fs.copyTpl(),两者都运行正常。现在,我正在创建一个子发布器,根据阅读文档here的要求扩展yeoman.generators.NamedBase

根据我上面链接的同一页面上的文档,我的文件结构似乎是正确的。就像这样:

├───package.json
├───app/
│   └───index.js
└───view/
    └───index.js
    └───templates/
        └───views/
            └───view.html

以下是我尝试用于在项目中生成这个新“视图”的代码,该视图位于视图目录的index.js中。

'use strict';
var yeoman = require('yeoman-generator');

module.exports = yeoman.generators.NamedBase.extend({
    copyFile: function() {

        this.fs.copyTpl(
            'views/view.html',
            'app/views/'+this.name.toLowerCase()+'.html',
            { name: this.name.toLowerCase() }
        );
    }
});

我跑yo {generatorname}:view helloWorld期望它基于view.html模板创建一个新文件,该文件非常简单:

<p>This is the <%= name %> view.</p>

当我运行该命令时,我收到以下错误。

events.js:85
  throw er; // Unhandled 'error' event
        ^
TypeError: Cannot read property 'toString' of null
    at copy.process (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy-tpl.js:11:33)
    at applyProcessingFunc (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy.js:12:16)
    at EditionInterface.exports._copySingle (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy.js:52:24)
    at EditionInterface.exports.copy (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy.js:22:17)
    at EditionInterface.module.exports [as copyTpl] (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy-tpl.js:9:8)
    at module.exports.yeoman.generators.NamedBase.extend.copyFile (/Users/woodruffjb/dev/yeoman/{generatorname}/view/index.js:7:11)
    at /Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/lib/base.js:408:16
    at processImmediate [as _immediateCallback] (timers.js:358:17)

我试图查看问题是this.name是未定义还是null,但是当我执行console.log(this.name)时,我得到了正确的响应,即helloWorld。在经过大量的谷歌搜索后,我能找到的唯一错误就是其他与我试图完全无关的事情,包括Atom包和Node.js服务器代码。

我能想到的是我在某种程度上错误地使用this.fs.copyTpl()?但是,我使用它与我在app/index.js文件中使用它完全相同,以进行初始项目设置。经过我所有的搜索,我都遇到了这个问题。根据位于here的该函数的文档,我似乎做得对。有人知道我的错误吗?

1 个答案:

答案 0 :(得分:0)

在磁盘上找不到'views/view.html'的可能性。

这是因为每个this.fs方法都不会神奇地解析您的路径。安全的方法是始终提供绝对的路径。在您的情况下,您想要复制位于模板目录中的文件,因此您将使用this.templatePath('views/view.html')来获取它的绝对路径。