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 模块时,必须提供文件扩展名: https://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文件不停在创建,解决方法是判断路径下文件是否已存在,若已存在则不再创建文件
参考文献:https://www.656463.com/wenda/Nodemonbuduanzhongqifuwuqi_504

posted @ 2022-06-01 16:56  沐木琴  阅读(547)  评论(0编辑  收藏  举报