出现 uncaughtException:错误:尝试在 Next.js 中使用 pino.transport 时找不到模块 '...\.next\server\app\home\lib\worker.js'

use*_*053 8 typescript next.js pinojs next.js13 pino

我使用 create-next-app 使用 typescript 创建了一个 Next.js 项目。为了记录这个特定项目,我决定使用 Pino 日志库,因为它是 Next.js 本身推荐的。

当我使用没有传输功能的 Pino 时,它运行得非常好。下面是完美运行的 pino 定义代码:-

import pino from 'pino';

const logger = pino({
    level: process.env.NEXT_PUBLIC_LOG_LEVEL,
    formatters: {
        level: (label) => {
            return { level: label.toUpperCase() };
        },
        bindings: (bindings) => {
            return { host: bindings.hostname };
        },
    },
});

export default logger;
Run Code Online (Sandbox Code Playgroud)

但是当我使用 Pino 传输时,代码如下所示(我已安装 pino-pretty 作为开发依赖项):-

import pino from 'pino';

const logger1 = pino({
    transport: {
        target: 'pino-pretty',
    },
});

logger1.info('hi');
export default logger1;

Run Code Online (Sandbox Code Playgroud)

我收到下面提到的错误

- error uncaughtException: Error: Cannot find module 'C:\starttwo-productionlot-frontend\.next\server\app\home\lib\worker.js'
    at Module._resolveFilename (node:internal/modules/cjs/loader:1075:15)
    at Module._load (node:internal/modules/cjs/loader:920:27)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at MessagePort.<anonymous> (node:internal/main/worker_thread:164:24)
    at [nodejs.internal.kHybridDispatch] (node:internal/event_target:737:20)
    at exports.emitMessage (node:internal/per_context/messageport:23:28) {
  digest: undefined
}
- error node_modules\thread-stream\index.js (195:31) @ Worker.onWorkerExit
- error uncaughtException: Error: the worker thread exited
    at Worker.onWorkerExit (webpack-internal:///(sc_server)/./node_modules/thread-stream/index.js:163:34)
    at Worker.emit (node:events:513:28)
    at [kOnExit] (node:internal/worker:289:10)
    at Worker.<computed>.onexit (node:internal/worker:209:20)
    at Worker.callbackTrampoline (node:internal/async_hooks:130:17) {
  digest: undefined
}

Run Code Online (Sandbox Code Playgroud)

我也遇到了与此代码相同的错误(这里我有一个问题,我们需要使用 npm 安装 pino/file 吗?):-

import pino from 'pino';
const transport = pino.transport({
  target: 'pino/file',
  options: { destination: '/path/to/file' }
})
pino(transport)
Run Code Online (Sandbox Code Playgroud)

我在服务器端使用记录器,仅在 next.js page.tsx 文件中没有“使用客户端”指令您能请我解决此错误吗

我尝试实现 pino 官方文档中提供的示例代码,但我得到了与上述相同的错误,代码如下:-

在 my-transport.tsx 中:-

import { createWriteStream } from 'fs'

export default () => {
  return createWriteStream('.../app/app.log)')// /app/app.log -- location of log file 
}
Run Code Online (Sandbox Code Playgroud)

在 logger.tsx 中:-

const pino = require('pino')
const transport = pino.transport({
  target: '/absolute/path/to/my-transport.mjs'
})
export default pino(transport)
Run Code Online (Sandbox Code Playgroud)

在 next.js 中使用 pino.transport() 是否有任何限制?我们可以在客户端和服务器端使用它吗?我如何使用 pino 中的传输功能?

Art*_*hle 0

你有.../path/而不是../path/(一个.太多)

\n

但这并不能解决问题。

\n

解决方案

\n

您在网络服务器上。除非您配置自定义服务器(这是可能的),否则您无法使用 Next.js 导航到网络服务器的根目录之后,更多信息如下:

\n

配置自定义服务器

\n

GitHub 讨论:提到的自定义根方法

\n
\n

\xe2\x9a\xa0\xef\xb8\x8f 建议

\n

您应该放置.gitignore.next目录,因此无论您尝试什么,都应该将其放入另一个目录。

\n
\n

如果该文件位于网络服务器根目录内,则:

\n

推荐:

\n
/*\n * __dirname     current directory\n * process.cwd() directory where process/server was started\n */\nimport path from "path";\n\n// concatenation of paths (e.g. to avoid `/` issues\npath.join(__dirname, "where/you/want/to/go");\n\n// or to get the absolute path\npath.resolve(__dirname, "where/you/want/to/go");\n\n
Run Code Online (Sandbox Code Playgroud)\n