typescript - Får uncaughtException: Error: Cannot find module '...\.next\server\app\home\lib\worker.js' når man prøver å bruke pino.transport i Next.js
Jeg har opprettet et Next.js-prosjekt med TypeScript ved hjelp av create-next-app. For logging av dette spesifikke prosjektet har jeg bestemt meg for å bruke Pino logging-biblioteket, da det anbefales av Next.js selv.
Når jeg bruker Pino uten transportfunksjonaliteten, fungerer det helt fint. Nedenfor er Pino-definisjonskoden som fungerer perfekt:-
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;
Men når jeg bruker Pino transport, er koden nevnt nedenfor (jeg har installert pino-pretty som en dev-avhengighet):
import pino from 'pino';
const logger1 = pino({
transport: {
target: 'pino-pretty',
},
});
logger1.info('hi');
export default logger1;
Jeg får den nedenfor nevnte feilen
- 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
}
Jeg får den samme feilen med denne koden også (Her har jeg et spørsmål, trenger vi å installere pino/file med npm?):-
import pino from 'pino';
const transport = pino.transport({
target: 'pino/file',
options: { destination: '/path/to/file' }
})
pino(transport)
Jeg bruker loggerne på serversiden, det er bare i next.js page.tsx-fil som ikke har "use client"-direktiv. Kan du hjelpe meg med å løse denne feilen
Jeg prøvde å implementere eksempelkoden som ble gitt i Pinos offisielle dokumentasjon, men jeg får den samme ovennevnte feilen. Koden var som følger:-
I min-transport.tsx:-
import { createWriteStream } from 'fs'
export default () => {
return createWriteStream('.../app/app.log)')// /app/app.log -- location of log file
}
I logger.tsx:-
const pino = require('pino')
const transport = pino.transport({
target: '/absolute/path/to/my-transport.mjs'
})
export default pino(transport)
Er det noen begrensning på bruk av pino.transport() i next.js? Kan vi bruke det både på klient- og serversiden? Hvordan kan jeg bruke transportfunksjonaliteten i pino?
Svar #1
Du har .../path/ i stedet for ../path/ (én . for mye)
Men dette vil ikke løse problemet.
Løsning
Du er på en webserver. Du kan ikke navigere lenger tilbake enn webserverens rotkatalog med Next.js med mindre du konfigurerer en egendefinert server (det er mulig), mer informasjon her:
Konfigurere tilpasset server
GitHub-diskusjon: nevnt tilpasset rot-tilnærming
⚠️ Råd
Du bør .gitignore katalogen .next, så uansett hva du prøver, bør du uansett legge det i en annen katalog.
Hvis filen er inne i webserverens rot, da:
Anbefaling:
/*
* __dirname current directory
* process.cwd() directory where process/server was started
*/
import path from "path";
// concatenation of paths (e.g. to avoid `/` issues
path.join(__dirname, "where/you/want/to/go");
// or to get the absolute path
path.resolve(__dirname, "where/you/want/to/go");
