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