模板启动错误 - TypeError("Parameter 'url' must be a string, not " + typeof url)

Stencil Start Error - TypeError("Parameter 'url' must be a string, not " + typeof url)

我已经使用 stencil 一段时间了,正在为其开发自定义主题,我已经安装了 nvm 和 node 5.0 以及 npm 2。我还删除了 stencil 并重新安装了所有内容include node modules and stencil init 但无论什么时候 运行 stencil 开始我仍然会收到下面的错误,我已经用谷歌搜索了这个并且结果是空的所以我希望有人能帮助我。提前致谢!

  ⇒  stencil start
url.js:110
    throw new TypeError("Parameter 'url' must be a string, not " + typeof url)
          ^
TypeError: Parameter 'url' must be a string, not undefined
    at Url.parse (url.js:110:11)
    at Object.urlParse [as parse] (url.js:104:5)
    at module.exports (/usr/local/lib/node_modules/@bigcommerce/stencil-cli/server/index.js:14:31)
    at startServer (/usr/local/lib/node_modules/@bigcommerce/stencil-cli/bin/stencil-start:188:5)
    at /usr/local/lib/node_modules/@bigcommerce/stencil-cli/bin/stencil-start:166:32
    at /usr/local/lib/node_modules/@bigcommerce/stencil-cli/server/lib/stencil-token.js:55:24
    at finish (/usr/local/lib/node_modules/@bigcommerce/stencil-cli/node_modules/wreck/lib/index.js:137:20)
    at wrapped (/usr/local/lib/node_modules/@bigcommerce/stencil-cli/node_modules/hoek/lib/index.js:866:20)
    at ClientRequest.onResponse (/usr/local/lib/node_modules/@bigcommerce/stencil-cli/node_modules/wreck/lib/index.js:158:20)
    at ClientRequest.g (events.js:199:16)

我从未使用过 Stencil,但出现此错误是因为 URL 未在您的模板配置文件 (./.stencil) 中设置。这是应该在 stencil init 期间设置的内容吗?

具体来说,你需要确保这两个值已经在 .stencil 文件中设置(我假设它是一个 JSON 配置文件,位于你的项目根目录中):

  1. storeUrl----------------//把url转到安全页面(提示为登录页面)
  2. normalStoreUrl ---//主页的宿主url

了解如何调试 Node 错误可能会有用。以下是我在阅读和调试时的思维过程:

1.

TypeError: Parameter 'url' must be a string, not undefined
at Url.parse (url.js:110:11)
at Object.urlParse [as parse] (url.js:104:5)

所以错误很简单。该程序试图从字符串中解析 URL,但该字符串未定义,因此导致主要错误。具体来说,节点模块 url.js 正在尝试进行解析。

URL 应该在哪里定义?让我们继续看看我们是否能弄清楚。

2:

at module.exports (/usr/local/lib/node_modules/@bigcommerce/stencil-cli/server/index.js:14:31)

https://github.com/bigcommerce/stencil-cli/blob/master/server/index.js
好的,让我们打开这个文件并查看第 14 行,它显示为:

module.exports = function(options, callback) {
    var config = manifest.get('/'),
        parsedSecureUrl = Url.parse(options.dotStencilFile.storeUrl), //Line 14 - The url to a secure page (prompted as login page)
        parsedNormalUrl = Url.parse(options.dotStencilFile.normalStoreUrl); //The host url of the homepage;
...

好的,我们已经找到了引发错误的确切行 (parsedSecureUrl)。此 URL 应该包含在用于初始化此模块的选项对象中 (module.exports = function(options, callback) {})

需要继续挖掘以查看从哪里定义了这个选项对象,以及它是如何包含它的 dotStencilFile 属性 (options.dotStencilFile).

3:

at startServer (/usr/local/lib/node_modules/@bigcommerce/stencil-cli/bin/stencil-start:188:5)

https://github.com/bigcommerce/stencil-cli/blob/master/bin/stencil-start 上面写着:

 /**
 * Starts up the local Stencil Server as well as starts up BrowserSync and sets some watch options.
 */
function startServer() {
    var params = {
        dotStencilFile: dotStencilFile,   //It's getting set here!!
        variationIndex: themeConfig.variationIndex || 0,
        stencilEditorEnabled: Program.themeEditor,
        stencilEditorPort: Program.themeEditorPort || 8181,
        useCache: Program.cache
    };
    //Line 188 below:
    Server(params, function (err) {
        var watchFiles = [
            '/assets',
            '/templates',
            '/lang'
        ];
    ...

因此我们在第 2 步中找到了负责初始化并将 options 参数传递给模块的函数。具体来说,该变量称为 params 并且该对象应该包含URL 是 params.dotStencilFile

在这一点上,我们只需要弄清楚 dotStencilFile 应该是什么。

4:

通过搜索此文件中的源代码,我可以看到 dotStencilFile 是通过以下方式声明的: dotStencilFile = Fs.readFileSync(dotStencilFilePath, {encoding: 'utf-8'});
所以 dotStencilFile 的值是通过从位于 dotStencilFilePath.

的磁盘读取文件来设置的

那么最后一个问题,它的路径是什么? ...dotStencilFilePath的价值是多少?

对我们来说很容易,它的值在同一个文件中定义:
var dotStencilFilePath = Path.join(themePath, '.stencil');
其中 themePath = var themePath = process.cwd();(此文件的当前工作目录,假定为项目根目录)。

5:(解)
好的,我们明白了!应该包含 URL 的文件称为 .stencil(隐藏文件),位于项目根目录 (/Users/rob/myStencilProject/.stencil) 中。

这个 .stencil 文件应该是一个 JSON 文件,其中包含两个 URL 属性的值:storeUrlnormalStoreUrl

我应该检查此文件以确保已设置这些属性。我应该在 stencil init 期间设置它们吗?我可以手动设置它们吗?无论哪种方式,我都确定主要错误是由于该文件不包含上述两个 URLs.

的值而引起的

好吧,我希望这些信息有助于解决您当前的问题,以及您在开发过程中可能遇到的任何其他问题。祝你好运!

我已经解决了这个问题。 url 应该由 Stencil 在 Stencil init 上设置,然后在 Stencil 启动时匹配它们。事实证明,我并不知道客户的账户已经不活跃了,这意味着它不复存在了。简而言之,url 出现未定义,因为不再有 url 被定义,因为客户端不再有一个设置。