将 @elastic/elasticsearch 与 Next.js 结合使用

问题描述 投票:0回答:1

我想在 next.js 中使用弹性搜索进行日志收集,但出现此错误:

 ⨯ node:console
Module build failed: UnhandledSchemeError: Reading from "node:console" is not handled by plugins (Unhandled scheme).
Webpack supports "data:" and "file:" URIs by default.
You may need an additional plugin to handle "node:" URIs.
Import trace for requested module:
node:console
./node_modules/undici/lib/mock/pending-interceptors-formatter.js
./node_modules/undici/lib/mock/mock-agent.js
./node_modules/undici/index.js
./node_modules/@elastic/transport/lib/connection/UndiciConnection.js
./node_modules/@elastic/transport/lib/connection/index.js
./node_modules/@elastic/transport/index.js
./node_modules/@elastic/elasticsearch/index.js
./src/lib/logger.ts

这是我的代码

// src/lib/logger.ts
import { Client } from "@elastic/elasticsearch";
const client = new Client({
    node: "http://localhost:9200/",
});
export default class Logger {
    static async log(index: string, body: object) {
        await client.index({ index, body });
    }
}
// src/middleware.ts
import { NextRequest } from "next/server";
import Logger from "@/lib/logger";

export async function middleware(request: NextRequest) {
    // ...
    Logger.log("cb-request-logs", {
        user: session.user._id,
        url: request.url,
        userAgent: request.headers.get("User-Agent"),
    });
    // ...
}

我的环境:

节点 v20

nextjs v14.2.7

@elastic/elasticsearch ^8.15.0

node.js elasticsearch next.js elastic-stack
1个回答
0
投票

我注意到您使用的节点地址是

http
而不是
https
。 这是故意的吗? (如果没有,请尝试使用
node: "https://localhost:9200"

注意:我删除了结尾的“/”,所以

node: "https://localhost:9200"
而不是
node: "https://localhost:9200/"


  1. Elasticsearch 默认需要 https

  2. 快速检查:您可以通过运行这些命令来测试端点来检查您的 Elasticsearch 是否正常运行(另外,您使用的是 Mac 还是 Docker?根据系统的不同,命令略有不同):

麦克:

curl --cacert $ES_HOME/config/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200 

码头工人:

curl --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200

如果出现错误,您可以尝试分别在 MacDocker 上进行安装。

  1. 如果您不想使用 HTTP,您可以按照此 guide 进行操作,并记住停止/重新启动 Elasticsearch。 (不推荐此路径,仅用于实验。) 第 3 点的要点是进入配置文件 (
    elasticsearch.yml
    ) 并将以下设置从 true 更改为 false:
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.enabled: true

再次强调,第 3 点不是推荐的方法,但适合学习/实验。

© www.soinside.com 2019 - 2024. All rights reserved.