我正在尝试使用MQTT.js捆绑我们的一个微服务,而我正为一个非常奇怪的问题而苦苦挣扎。
无需捆绑即可正常工作,因此ws
中有node_modules
。
我认为很重要的东西
错误:
TypeError: WS is not a constructor
at WebSocketStream (dist/index.js:159329:16)
at createWebSocket (dist/index.js:147450:10)
at Object.buildBuilderBrowser (dist/index.js:147476:10)
at MqttClient.wrapper [as streamBuilder] (dist/index.js:147937:36)
at MqttClient._setupStream (dist/index.js:146471:22)
at new MqttClient (dist/index.js:146452:8)
at Function.connect (dist/index.js:147940:10)
Webpack配置:
const path = require('path');
const nodeExternals = require('webpack-node-externals');
const { NODE_ENV = 'production' } = process.env;
module.exports = {
entry: { index: './src/index.ts' },
mode: NODE_ENV,
target: 'node',
watch: NODE_ENV === 'development',
externals: [nodeExternals()],
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js',
},
resolve: {
extensions: ['.ts', '.js'],
},
node: {
__dirname: false,
},
module: {
rules: [
{
test: /\.ts$/,
use: [{ loader: 'ts-loader', options: { transpileOnly: true } }],
},
{
test: /(\.md|\.map)$/,
loader: 'null-loader',
},
],
},
};
发生的功能:
createMqttClient(): MqttClient {
return mqtt.connect(this.mqttOptions.url, { ...this.mqttOptions.options });
}
该网址类似于:ssl://url-to-our-mqtt
有人可以帮忙吗?
答案 0 :(得分:0)
我也遇到了同样的问题。 我的问题是我曾经使用过
plugins: [
new webpack.NormalModuleReplacementPlugin(/^mqtt$/, "mqtt/dist/mqtt.js"),
],
在webpack.config.js中使用来解决mqtt.js附带的shebang错误,因为它是一个CLI工具。 然后我改用
{
test: [
/node_modules[/\\]mqtt[/\\]mqtt.js/,
/node_modules[/\\]mqtt[/\\]bin[/\\]sub.js/,
/node_modules[/\\]mqtt[/\\]bin[/\\]pub.js/,
],
loader: 'shebang-loader'
},
我的问题已解决。您是否还在导入中使用mqtt / dist / mqtt.js而不是mqtt,或者是否执行了类似于我的操作,那么我上面发布的shebang-loader规则可能会解决您的问题。
答案 1 :(得分:0)
我在使用Amazon aws-iot-device-sdk-js和Microsoft azure-iot-device-mqtt时都遇到了同样的情况,它们都包含mqtt。
最初的问题是构建错误:
ERROR in ./node_modules/mqtt/mqtt.js Module parse failed: Unexpected character '#' (1:0)
此错误是由软件包mqtt引起的。三个文件(mqtt.js,pub.js和sub.js)包含shebang行
#!/usr/bin/env node
使用模块更换的解决方案建议了一些地方
plugins: [
new webpack.NormalModuleReplacementPlugin(/^mqtt$/, "mqtt/dist/mqtt.js"),
],
不幸的是,将构建错误更改为运行时错误
TypeError: WS is not a constructor
如其他答案中所述,可以将webpack配置为(https://webpack.js.org/concepts/loaders/)以使用shebang加载程序(https://www.npmjs.com/package/shebang-loader)
TL; DR
安装shebang-loader
npm install shebang-loader --save
在webpack.config.js中,使用加载程序
module.exports = {
...
module: {
rules: [
{
test:
[
/.*mqtt\.js$/,
/.*sub\.js$/,
/.*pub\.js$/
],
use: 'shebang-loader'
}
]
}
}