LowDB采坑記錄(主要為lowdb3.0的Cannot find module和lowdb1.0 node不斷自啟動的問題)

bug1: Error [ERR_ MODULE_ NOT_ FOUND]: Cannot find module

在使用最新版LowDB(3.0)時,發現typescript中直接引用模塊名(如以下代碼示例)

import * as allService from '../all.service'

問題在於LowDB3.0官網示例中,import.meta.url要求tsconfig.json中的”module”不能為”commonjs”

// db.ts
const __dirname = dirname(fileURLToPath(import.meta.url));

// tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "target": "esnext",
    "sourceMap": true,
    "outDir": "dist"
  },
}

這意味着ts文件中的模塊將無法被調用,因此出現’Error [ERR_ MODULE_ NOT_ FOUND]: Cannot find module’的錯誤提示。
我的解決方法是將LowDB的版本降到1.0。
網上解決方法總結如下:
answer1:
使用 ECMAScript 模塊時,必須提供文件擴展名: //nodejs.org/api/esm.html#esm_mandatory_file_extensions
因此,除了在package.json中使用"type": "module"之外,您還需要指定文件擴展名import { url } from './helpers.js'。您還可以使用標誌--es-module-specifier-resolution = node 將js文件解析為模塊,就像之前使用require一樣

answer2:
將下面的命令行

node index.js

換為

node --experimental-specifier-resolution=node index.js

或者在package.json文件中添加命令行

"scripts": {
  "start": "NODE_OPTIONS='--experimental-specifier-resolution=node' node src/index.js
 }

answer3:
在使用 ES 模塊時,我們必須在 import 語句中指定文件擴展名

import * from "./demo.js"  // Works fine
import * from "./demo" // Will throw error as you see

ps: 上面兩個選項在使用 commonJs 時都是有效的

答案選自stack overflow上的帖子,訪問原帖請點擊以下鏈接:
stack overflow

bug2: lowdb1.0+typescript+nodemon,nodemon不斷重啟服務器

解決方法:
根源在於存儲數據的db.json文件不停在創建,解決方法是判斷路徑下文件是否已存在,若已存在則不再創建文件
參考文獻://www.656463.com/wenda/Nodemonbuduanzhongqifuwuqi_504

Tags: