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