whyour / qinglong

支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台(Timed task management platform supporting Python3, JavaScript, Shell, Typescript)
https://qinglong.online
Apache License 2.0
15.66k stars 2.91k forks source link

node 安装的依赖,脚本无法使用 #2345

Closed guicaiyue closed 4 months ago

guicaiyue commented 4 months ago

Qinglong version

2.17.3

Steps to reproduce

  1. 先在依赖管理安装了 node-fetch 依赖
  2. 在脚本管理,package.json 文件中增加 "type":"module",最终结果如下
    
    {
    "name": "dependence",
    "author": "",
    "license": "ISC",
    "type":"module",
    "dependencies": {
    "got": "^11.5.1",
    "nodemailer": "^6.8.0",
    "tough-cookie": "^4.0.0",
    "tunnel": "0.0.6",
    "ws": "^7.4.3"
    }
    }
4. 新增test.js文件,拷贝如下内容到文件中

```javascript
import fetch from 'node-fetch'; //使用fetch必须加上该代码
async function sendWeather(){
    const appid = "51396431";
    const appsecret = "LNY47Ewu";
    let url = `https://v0.yiketianqi.com/api?unescape=1&version=v61&appid=${appid}&appsecret=${appsecret}&cityid=encodeURIComponent("成都")`;
    let response = await fetch(url);
    if(response.ok){
        let result = await response.text();
        console.log(result);
    }else{
        console.log("发送天气请求失败");
        return false;
    }
}

async function allTasks(){
    await sendWeather();
}

allTasks();
  1. 调试运行,报错如下
    
    ## 开始执行... 2024-04-23 12:06:21

node:internal/process/esm_loader:97 internalBinding('errors').triggerUncaughtException( ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'node-fetch' imported from /ql/data/scripts/atest1.swap.js Did you mean to import node-fetch@3.3.2/node_modules/node-fetch/src/index.js? at new NodeError (node:internal/errors:399:5) at packageResolve (node:internal/modules/esm/resolve:889:9) at moduleResolve (node:internal/modules/esm/resolve:938:20) at defaultResolve (node:internal/modules/esm/resolve:1153:11) at nextResolve (node:internal/modules/esm/loader:163:28) at ESMLoader.resolve (node:internal/modules/esm/loader:838:30) at ESMLoader.getModuleJob (node:internal/modules/esm/loader:424:18) at ModuleWrap. (node:internal/modules/esm/module_job:77:40) at link (node:internal/modules/esm/module_job:76:36) { code: 'ERR_MODULE_NOT_FOUND' }

Node.js v18.16.1

执行结束... 耗时 1 秒

### What is expected?

希望知道怎么做,以及原因,为什么依赖装好了,但无法脚本内依旧无法找到
是因为依赖管理安装的是全局包吗?
package.json 文件的意义是局部包吗?
要进 package.json 所在目录执行install 安装局部包吗?

### What is actually happening?

依赖没有找到

### System Info

```shell
docker 部署

Any additional comments?

如果和正常项目脚本开发有差异,不管是nodejs还是python,都希望能有差一点文档,不然门槛太高了

whyour commented 4 months ago

后缀改成 ts

guicaiyue commented 4 months ago

后缀改成 ts

还是失败了

1714189716049
guicaiyue commented 4 months ago

是哪个环节有问题?

whyour commented 4 months ago

@guicaiyue 你这不是最新镜像吧,node 版本不对

whyour commented 4 months ago

不需要改 package.json

guicaiyue commented 4 months ago

好我再试试

guicaiyue commented 4 months ago

@guicaiyue 你这不是最新镜像吧,node 版本不对

我用的是docker部署,然后通过面板更新

whyour commented 4 months ago

@guicaiyue 有备份目录的情况下,可以使用 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -cR <容器名> 更新试试

guicaiyue commented 4 months ago

@guicaiyue 有备份目录的情况下,可以使用 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -cR <容器名> 更新试试

好的,我已经重新更新了一个新的版本,node版本为v20.12.1 node-fetch 模块脚本已经能正常运行使用了 步骤: 1、一个最新的青龙面板,初始化登录 2、依赖安装node-fetch模块 3、脚本管理新建一个atest.ts文件 4、将内容拷贝进去,点击调试,可以执行获取结果,未出现包依赖问题

但我现在遇到了另一个问题 我通过依赖管理安装 x-crawl 模块 新增 btest.ts 文件使用如下代码

import { createCrawl } from 'x-crawl'

const crawlApp = createCrawl({ intervalTime: { max: 3000, min: 1000 } })

crawlApp
  .crawlHTML([
    'https://www.example.com/html-1',
    'https://www.example.com/html-2'
  ])
  .then((res) => {
    // 处理
    console.log(res);
  })

调试报错如下,说我使用了CJS模块导入,但我用的是 import ,还是因为这个依赖还引用了其他依赖的原因

1714191961249
guicaiyue commented 4 months ago

测试发现,当我在脚本管理根目录下新增一份 package.json 文件内容如下

{
  "name": "dependence",
  "version": "1.0.0",
  "author": "",
  "type": "module",
  "license": "ISC"
}

我的 btest.ts 文件就能执行成功,但同时原来执行 ok 的 atest.ts 文件执行失败,提示无法找到依赖模块报错内容如下

1714194324475

测试发现重点是 "type": "module" 配置,意思是启用 ESModule ,否则默认 CommonJS 当我将 "type": "module" 从 package.json 文件内容移除时,这时 atest.ts 能执行成功,btest.ts 不能执行成功,加上两者就反过来了。

guicaiyue commented 4 months ago

解决了,一个 node 模块的导出方式决定它是CommonJS 还是 ESModule 。所以不是通过导入方式判断的,所以目录调整如下

1714195346493

外部 package.json 文件内容不带"type": "module",使用 CommonJS 模式加载,所以 atest.ts 能调试执行

{
  "name": "dependence",
  "version": "1.0.0",
  "author": "",
  "license": "ISC"
}

在 esm 文件目录下也新增 package.json 文件内容如下

{
    "type": "module"
}

所以 node 使用 ESModule 模式加载 btest.ts 文件也能执行

暂未发现其他问题,此帖完结

tasty007 commented 4 months ago

解决了,一个 node 模块的导出方式决定它是CommonJS 还是 ESModule 。所以不是通过导入方式判断的,所以目录调整如下 1714195346493 外部 package.json 文件内容不带"type": "module",使用 CommonJS 模式加载,所以 atest.ts 能调试执行

{
  "name": "dependence",
  "version": "1.0.0",
  "author": "",
  "license": "ISC"
}

在 esm 文件目录下也新增 package.json 文件内容如下

{
    "type": "module"
}

所以 node 使用 ESModule 模式加载 btest.ts 文件也能执行

暂未发现其他问题,此帖完结

老哥, 你能在python中加载 canvas依赖吗?

guicaiyue commented 4 months ago

解决了,一个 node 模块的导出方式决定它是CommonJS 还是 ESModule 。所以不是通过导入方式判断的,所以目录调整如下 1714195346493 外部 package.json 文件内容不带"type": "module",使用 CommonJS 模式加载,所以 atest.ts 能调试执行

{
  "name": "dependence",
  "version": "1.0.0",
  "author": "",
  "license": "ISC"
}

在 esm 文件目录下也新增 package.json 文件内容如下

{
    "type": "module"
}

所以 node 使用 ESModule 模式加载 btest.ts 文件也能执行 暂未发现其他问题,此帖完结

老哥, 你能在python中加载 canvas依赖吗?

还没用过,遇到什么问题了嘛?有例子嘛

tasty007 commented 4 months ago

解决了,一个 node 模块的导出方式决定它是CommonJS 还是 ESModule 。所以不是通过导入方式判断的,所以目录调整如下 1714195346493 外部 package.json 文件内容不带"type": "module",使用 CommonJS 模式加载,所以 atest.ts 能调试执行

{
  "name": "dependence",
  "version": "1.0.0",
  "author": "",
  "license": "ISC"
}

在 esm 文件目录下也新增 package.json 文件内容如下

{
    "type": "module"
}

所以 node 使用 ESModule 模式加载 btest.ts 文件也能执行 暂未发现其他问题,此帖完结

老哥, 你能在python中加载 canvas依赖吗?

还没用过,遇到什么问题了嘛?有例子嘛

大佬您试试在面板装依赖的python3页面装这个canvas依赖,试试能否成功, 不知道canvas这个依赖的历史版本哪里找.