使用MySQL对NodeJS Express API进行Webpacking会导致模式'-p'中的连接错误,而不是'-d'中的连接错误

时间:2018-03-02 13:33:17

标签: node.js webpack mysqljs

我有一个简单的Express API,我使用MySQL来检索我的数据。我使用 Webpack 4 将其捆绑在一个非常简单的配置中:

'use strict';

const path = require('path');

module.exports = {
    entry: './src/main.js',
    target: 'node',
    output: {
        filename: 'gept_api.js',
        path: path.resolve(__dirname, 'dist'),
    },
    node: {
        __dirname: true,
    },
};

当我使用webpack --config webpack.config.js -d进行开发时,一切正常。

但是,当我为生产运行webpack --config webpack.config.js -p时,它突然不再起作用,并在从池中获取连接时抛出错误。

TypeError: Cannot read property 'query' of undefined
at Object.getItem (C:\Users\freek\Dropbox\Code\Apps\GEPT\GEPTv2_API\dist\gept_api.js:1:154359)
at t.db_pool.getConnection (C:\Users\freek\Dropbox\Code\Apps\GEPT\GEPTv2_API\dist\gept_api.js:1:154841)
at c._callback (C:\Users\freek\Dropbox\Code\Apps\GEPT\GEPTv2_API\dist\gept_api.js:1:68269)
at c.end (C:\Users\freek\Dropbox\Code\Apps\GEPT\GEPTv2_API\dist\gept_api.js:1:8397)
at C:\Users\freek\Dropbox\Code\Apps\GEPT\GEPTv2_API\dist\gept_api.js:1:322509
at Array.forEach (<anonymous>)
at C:\Users\freek\Dropbox\Code\Apps\GEPT\GEPTv2_API\dist\gept_api.js:1:322487
at process._tickCallback (internal/process/next_tick.js:112:11)

所以不知怎的,这是通过在webpack 4中使用生产模式来打破的。连接对象以某种方式未定义,但它不处于开发模式。

我不知道如何解决这个问题,因为我是使用Webpack的菜鸟。我尝试在谷歌上搜索,但找不到任何相关内容。

我如何创建我的游泳池:

'use strict';

var mysql = require('mysql');
var secret = require('./db-secret');

module.exports = {
    name: 'gept_api',
    hostname: 'https://api.toxsickproductions.com/gept',
    version: '1.3.0',
    port: process.env.PORT || 1910,
    db_pool: mysql.createPool({
        host: secret.host,
        port: secret.port,
        user: secret.user,
        password: secret.password,
        database: secret.database,
        ca: secret.ca,
    }),
};

我如何使用连接:

pool.getConnection((err, connection) => {
    PlayerRepository.getPlayer(req.params.username, connection, (statusCode, player) => {
        connection.release();
        res.status(statusCode);
        res.send(player);
        return next();
    });
});  

/** Get the player, and logs to HiscoreSearch if exists.
 *
 * Has callback with statusCode and player. Status code can be 200, 404 or 500.
 * @param {string} username The player's username.
 * @param {connection} connection The mysql connection object.
 * @param {(statusCode: number, player: { username: string, playerType: string }) => void} callback Callback with statusCode and the player if found.
*/
function getPlayer(username, connection, callback) {
const query = 'SELECT p.*, pt.type FROM Player p JOIN PlayerType pt ON p.playerType = pt.id WHERE username = ?';

connection.query(query, [username.toLowerCase()], (outerError, results, fields) => {
        if (outerError) callback(500);
        else if (results && results.length > 0) {
            logHiscoreSearch(results[0].id, connection, innerError => {
                if (innerError) callback(500);
                else callback(200, {
                    username: results[0].username,
                    playerType: results[0].type,
                    deIroned: results[0].deIroned,
                    dead: results[0].dead,
                    lastChecked: results[0].lastChecked,
                });
            });
        } else callback(404);
    });
}

1 个答案:

答案 0 :(得分:0)

我找到了造成这个问题的原因。显然,mysql包依赖于Function.prototype.name,因为设置keep_fnames: true修复了生产版本。 (https://github.com/mishoo/UglifyJS2/tree/harmony#mangle-options

禁用 Webpack 4 标准缩小并使用自定义UglifyJSPlugin设置

'use strict';

const path = require('path');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')

module.exports = {
    entry: './src/main.js',
    target: 'node',
    output: {
        filename: 'gept_api.js',
        path: path.resolve(__dirname, 'dist'),
    },
    node: {
        __dirname: true,
    },
    optimization: {
        minimize: false,
    },
    plugins: [
        new UglifyJsPlugin({
            parallel: true,
            uglifyOptions: {
                ecma: 6,
                mangle: {
                    keep_fnames: true,
                },
            },
        }),
    ],
};