Node-redis: 没有安装hiredis

创建于 2017-07-11  ·  13评论  ·  资料来源: NodeRedis/node-redis

  • 版本:2.7.1
  • 平台:Node.js 8.1.3 / macOS 10.12.5
  • 描述:在项目上运行 yarn 或 npm install 并在生成 webpack 构建时出现此错误
ERROR in ./node_modules/redis-parser/lib/hiredis.js
Module not found: Error: Can't resolve 'hiredis' in
error Command failed with exit code 2.

webpack 配置如下:

var path = require('path')

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: ['babel-loader']
      }
    ]
  },
  target: 'node'
}

包.json

{
  "version": "1.0.0",
  "main": "src/index.js",
  "license": "MIT",
  "dependencies": {
    "dotenv": "^4.0.0",
    "koa": "^2.3.0",
    "koa-bodyparser": "^4.2.0",
    "koa-router": "^7.2.1",
    "node-fetch": "^1.7.1",
    "redis": "^2.7.1"
  },
  "devDependencies": {
    "babel-cli": "^6.24.1",
    "babel-loader": "^7.1.1",
    "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-plugin-transform-object-rest-spread": "^6.23.0",
    "babel-preset-env": "^1.5.2",
    "webpack": "^3.0.0"
  },
  "scripts": {
    "start": "node dist/bundle",
    "build": "webpack"
  },
  "babel": {
    "presets": [
      [
        "env",
        {
          "targets": {
            "node": "current"
          }
        }
      ]
    ],
    "plugins": [
      "transform-object-rest-spread",
      "transform-class-properties"
    ]
  }
}
invalid

最有用的评论

实际上,这不是 Webpack 的问题。 这是redis-parser如何使用hiredis的问题。 这个问题可以通过升级到redis-parser 3.0 来解决,它正好解决了这个问题。

所有13条评论

那一定和webpack有关。 我通过在 webpack 配置中使用 nodeExternals 插件解决了这个问题:

const nodeExternals = require('webpack-node-externals')

module.exports = {
  ...
  externals: [nodeExternals()],
  target: 'node'
}

nodeExternals 在服务器端捆绑时跳过 node_modules 文件夹中的任何模块。

这是 webpack 的问题。

实际上,这不是 Webpack 的问题。 这是redis-parser如何使用hiredis的问题。 这个问题可以通过升级到redis-parser 3.0 来解决,它正好解决了这个问题。

@guidobouman我们如何使用redis-parser 3.0 而不分叉 node_redis 并升级单个依赖项? 几周来我一直在寻找解决这个问题的方法,但没有成功。

@guidobouman任何有效的 JS 代码都应该适用于Webpack 。 情况似乎并非如此,这很可悲。 除此之外:我非常想知道为什么有人会想在 redis 上使用 Webpack。 缩小服务器端代码是一个非常糟糕的主意。

@peterschussheim我目前没有太多能力在 node_redis 上工作,这很可悲。 不过,仅升级 redis-parser 将是一个严重的问题。

@BridgeARhttps://github.com/NodeRedis/node-redis-parser/pull/36

缺少的参考是 Webpack 的根本问题。 删除hiredis 也完全修复了该错误为“附带损害”。

至于为什么要在与服务器相关的代码上运行 webpack:无服务器环境可能会运行旧版本的 Node,而有人希望能够使用诸如导入之类的现代语法。 (https://github.com/serverless-heaven/serverless-webpack)

@peterschussheim除了在node-redis $ 中增加redis-parser的版本之外,我还看到了另一种选择:自己安装hiredis 。 即使您可能没有使用hiredisredis-parser确实希望它存在。

实际上, @BridgeAR :这可以作为一个补丁版本,因为它是一个错误修复。 但是,是的,它将 Node 版本降至 4 以下,即使它们已经 EOL 很长一段时间了。

@guidobouman非常感谢您的建议。 虽然这是一个“黑客”,但我会接受它,因为我不能因为这个问题浪费更多的时间。

也许这对我自己或社区中的其他人来说是一个发布“现代”版本的好机会(非常非常遗憾,由于节点 4 的支持,我们推迟了这样的更改)。

👎

有人可以解释如何解决这个问题吗? 我不明白为什么我仍然需要添加hiredis作为直接依赖项。 其他人建议根本不使用hiredis ,那么我应该如何做到这一点?
文档说默认解析器不是hiredis 。 我正在使用最新版本,仍然需要hiredis 。 捆绑 AWS lambda 运行时时,Webpack 惨遭失败。

经过所有调整(更改为目标:'node'并另外安装'hiredis'),似乎仍然存在
捆绑的问题。 当我尝试将 Redis 与 Webpack 一起使用时,会出现“未捕获的 ReferenceError:require is not defined”。

这个问题仍然存在,因为hiredis 已被取消并且无法在节点12 中安装,redis-parser 在 v3.0.0 上将其删除,但此软件包仍使用 v2.6.0。

尝试通过以下方式与 parceljs 捆绑时也看到了这一点:

parcel build src/index.ts --bundle-node-modules --target node --no-source-maps --no-minify

我很想知道捆绑时我们会得到什么(摇树、优化容器化等)。 缩小与否,如果它有效,我想看看它的结果。 我们现在将坚持使用npm install和完整版本。

Hiredis 没有放弃(上一次 PR 是 10 天前)。 但是,我会欢迎 PR @sookoll更新到 3.0。

Hiredis 没有放弃(上一次 PR 是 10 天前)。 但是,我会欢迎 PR @sookoll更新到 3.0。

抱歉,我的意思显然是hiredis-node。 没想到有人会想到这里的节点环境。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

twappworld picture twappworld  ·  7评论

michaelwittig picture michaelwittig  ·  3评论

aletorrado picture aletorrado  ·  6评论

Alchemystic picture Alchemystic  ·  6评论

Mickael-van-der-Beek picture Mickael-van-der-Beek  ·  6评论