webpack-dev-server npm run dev throwing TypeError: Невозможно установить свойство 'port' из неопределенного

Для версий MySql, которые не поддерживают Common Table Expressions (до версии 5.7), вы достигнете этого следующим запросом:

select  id,
        name,
        parent_id 
from    (select * from products
         order by parent_id, id) products_sorted,
        (select @pv := '19') initialisation
where   find_in_set(parent_id, @pv)
and     length(@pv := concat(@pv, ',', id))

Здесь скрипт .

Значение, указанное в @pv := '19', должно быть установлено на id родителя, которому вы хотите выбрать всех потомков.

Это будет работать также, если родитель имеет несколько детей. Тем не менее, требуется, чтобы каждая запись выполняла условие parent_id < id, в противном случае результаты не будут выполнены.

Этот запрос использует определенный синтаксис MySql: переменные назначаются и изменяются во время его выполнения. Некоторые предположения сделаны о порядке выполнения:

  • Сначала оценивается предложение from. Таким образом, здесь инициализируется @pv.
  • Предложение where оценивается для каждой записи в порядке извлечения из псевдонимов from. Таким образом, это условие включает в себя только те записи, для которых родительский элемент уже был идентифицирован как находящийся в дереве потомков (все потомки основного родителя постепенно добавляются к @pv).
  • Условия в этом предложении where оцениваются по порядку, и оценка прерывается после того, как общий результат определен. Поэтому второе условие должно быть на втором месте, так как оно добавляет id в родительский список, и это должно произойти только в том случае, если id передает первое условие. Функция length вызывается только для того, чтобы убедиться, что это условие всегда истинно, даже если строка pv по какой-то причине дает значение фальши.

В целом, можно находят эти допущения слишком рискованными, чтобы полагаться на них - для них нет документальной гарантии, и даже несмотря на то, что она работает последовательно, порядок оценки может теоретически по-прежнему меняться, когда вы используете этот запрос как представление или подзапрос в более крупном запросе.

Также обратите внимание, что для очень больших наборов данных это решение может замедляться, поскольку операция find_in_set не является идеальным способом найти число в списке, но не в списке, который достигает размера в том же порядке, что и количество возвращенных записей.

Альтернатива 1: WITH RECURSIVE, CONNECT BY

Все больше и больше баз данных реализуют SQL: 1999 ISO стандартный WITH [RECURSIVE] синтаксис для рекурсивных запросов (например, Postgres 8.4 + , SQL Server 2005 + , DB2 , Oracle 11gR2 + , SQLite 3.8.4 + , Firebird 2.1 + , H2 , HyperSQL 2.1.0 + , Teradata , MariaDB 10.2.2 + ). А с версии 8.0 также поддерживает MySql . С этим синтаксисом запрос выглядит следующим образом:

with recursive cte (id, name, parent_id) as
(
 select     id,
            name,
            parent_id
 from       products
 where      parent_id = 19
 union all
 select     p.id,
            p.name,
            p.parent_id
 from       products p
 inner join cte
         on p.parent_id = cte.id
)
select * from cte;

В некоторых базах данных есть альтернативный, нестандартный синтаксис для иерархических поисков, таких как предложение CONNECT BY в базах данных Oracle. DB2 также поддерживает этот альтернативный синтаксис.

MySql версия 5.7 не предлагает такую ​​функцию. Когда ваш механизм базы данных предоставляет этот синтаксис, то это, безусловно, лучший вариант. Если нет, то также рассмотрите следующие альтернативы.

Альтернатива 2: Идентификаторы стиля пути

Все становится намного проще, если вы присвойте значения id, которые содержат иерархическую информацию: путь. Например, в вашем случае это может выглядеть так:

ID       | NAME
19       | category1   
19/1     | category2  
19/1/1   | category3  
19/1/1/1 | category4  

Тогда ваш select будет выглядеть так:

select  id,
        name 
from    products
where   id like '19/%'

Альтернатива 3: Повторные самосоединения

Если вы знаете верхний предел того, насколько глубоким может стать ваше дерево иерархии, вы можете использовать стандартный sql, например:

select      p6.parent_id as parent6_id,
            p5.parent_id as parent5_id,
            p4.parent_id as parent4_id,
            p3.parent_id as parent3_id,
            p2.parent_id as parent2_id,
            p1.parent_id as parent_id,
            p1.id as product_id,
            p1.name
from        products p1
left join   products p2 on p2.id = p1.parent_id 
left join   products p3 on p3.id = p2.parent_id 
left join   products p4 on p4.id = p3.parent_id  
left join   products p5 on p5.id = p4.parent_id  
left join   products p6 on p6.id = p5.parent_id
where       19 in (p1.parent_id, 
                   p2.parent_id, 
                   p3.parent_id, 
                   p4.parent_id, 
                   p5.parent_id, 
                   p6.parent_id) 
order       by 1, 2, 3, 4, 5, 6, 7;

См. этот скрипт

Условие where указывает, какой родительский элемент вы хотите получить потомкам. Вы можете расширить этот запрос с помощью большего количества уровней.

1
задан helpexchange 3 March 2019 в 08:00
поделиться

2 ответа

Попробуйте скопировать верхнюю часть вашего DevServer следующим образом

const devWebpackConfig = merge(baseWebpackConfig, {
    devServer: {
        clientLogLevel: 'warning',
        historyApiFallback: {
            rewrites: [
                { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }
            ]
        },
        hot: true,
        contentBase: false, // since we use CopyWebpackPlugin.
        compress: true,
        host: HOST || config.dev.host,
        port: PORT || config.dev.port,
        open: config.dev.autoOpenBrowser,
        overlay: config.dev.errorOverlay ?
            { warnings: false, errors: true } :
            false,
        publicPath: config.dev.assetsPublicPath,
        proxy: config.dev.proxyTable,
        disableHostCheck: true,
        inline: true,
        quiet: true, // necessary for FriendlyErrorsPlugin
        watchOptions: {
            poll: config.dev.poll
        }
    },
    module: {
        rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }),
        // cheap-module-eval-source-map is faster for development
        devtool: config.dev.devtool,

        // these devServer options should be customized in /config/index.js
        devServer: {
            clientLogLevel: 'warning',
            historyApiFallback: {
                rewrites: [
                    { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }
                ]
            },
            hot: true,
            contentBase: false, // since we use CopyWebpackPlugin.
            compress: true,
            host: HOST || config.dev.host,
            port: PORT || config.dev.port,
            open: config.dev.autoOpenBrowser,
            overlay: config.dev.errorOverlay ?
                { warnings: false, errors: true } :
                false,
            publicPath: config.dev.assetsPublicPath,
            proxy: config.dev.proxyTable,
            disableHostCheck: true,
            inline: true,
            quiet: true, // necessary for FriendlyErrorsPlugin
            watchOptions: {
                poll: config.dev.poll
            }
        },
        plugins: [
            new webpack.DefinePlugin({
                'process.env': require('../config/dev.env')
            }),
            new webpack.HotModuleReplacementPlugin(),
            new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
            new webpack.NoEmitOnErrorsPlugin(),
            // https://github.com/ampedandwired/html-webpack-plugin
            new HtmlWebpackPlugin({
                filename: 'index.html',
                template: 'index.html',
                inject: true
            }),
            // copy custom static assets
            new CopyWebpackPlugin([{
                from: path.resolve(__dirname, '../static'),
                to: config.dev.assetsSubDirectory,
                ignore: ['.*']
            }])
        ]
    }
})
0
ответ дан Vadim Hulevich 3 March 2019 в 08:00
поделиться

После долгих тренировок мне наконец-то удалось вернуть его к работе. Все еще не могу использовать npm run dev (выбрасывает ту же ошибку порта), но вместо этого я наткнулся на эту статью : исследование нулевого конфига с помощью vue

И теперь я буду запускать свой сервер разработки успешно с командой vue-cli-service serve --open.

0
ответ дан helpexchange 3 March 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: