模板启动错误 - TypeError(“参数'url'必须是字符串,而不是”+ typeof url)

时间:2016-05-04 20:28:03

标签: javascript node.js npm bigcommerce

我现在已经使用模板工作了一段时间,我正在为它开发一个自定义主题,我已经安装了nvm和节点5.0和npm 2.我还删除了模板并做了一切包括节点的全新安装模块和模板初始化但无论什么时候运行模板开始我仍然得到下面的错误,我已经搜索出来并且已经空了,所以我希望有人可以帮助我。提前致谢!

  ⇒  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)

2 个答案:

答案 0 :(得分:1)

我从未使用过Stencil,但是由于未在模板配置文件(./.stencil)中设置URL而引发此错误。这是应该在stencil init期间设置的吗?

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

  1. storeUrl -------------- //安全页面的网址(提示为登录页面)
  2. normalStoreUrl --- //主页的主机网址
  3. 了解如何调试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文件,其中包含两个网址属性的值:storeUrl&amp; normalStoreUrl

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

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

答案 1 :(得分:0)

我已经解决了这个问题。 url应该由Stencil init上的模板设置,然后在Stencil上启动它匹配它们。事实证明,我不知道客户的帐户已变为非活动状态,这意味着它已不再存在。简而言之,网址未定义,因为没有网址被定义为客户端不再有一个设置。