nyse
V2EX  ›  Node.js

NodeJS 程序,执行完后没有自动退出,可能是什么原因造成的?

  •  
  •   nyse · May 29, 2019 · 10360 views
    This topic created in 2715 days ago, the information mentioned may be changed or developed.

    NodeJS 写了一个程序,循环读取一个全局数组变量,当数组不为空时,把条目 POP 下来,提交给处理函数,处理函数使用 Promise 实现。

    执行到最后,当数组没有条目了,程序就停止那里不动,没有自动退出。

    有遇到过这种情况的吗?这有可能是什么原因造成的?

    14 replies  •  2020-05-22 20:42:43 +08:00
    mooncakejs
    mooncakejs
    May 29, 2019 via iPhone❤️1
    1
    望闻问切,好歹来个代码啊
    nyse
    nyse
    OP
    May 29, 2019
    2
    @mooncakejs 好大一个项目,我都不知道从哪查起。。。

    就想问一下有什么情况会让 NodeJS 不自动退出。。。
    yangg
    yangg
    May 29, 2019❤️1
    3
    process.on('uncaughtException', ...)
    airyland
    airyland
    May 29, 2019 via iPhone❤️1
    4
    看看有没有 setInterval
    v2nika
    v2nika
    May 29, 2019❤️1
    5
    Node.js 中的 io 句柄和 setTimeout/setInterval/setImmediate 默认都会阻止进程退出, 所以你的脚本应该是没跑完, 如果项目太大的话, 可以用 inspect 看一下
    maichael
    maichael
    May 29, 2019❤️1
    6
    有写退出的逻辑吗?当数组为空时是怎么处理的。
    AlloVince
    AlloVince
    May 29, 2019❤️1
    7
    如果使用了连接 redis 或者 mysql 的库,一般需要在程序执行完后手动断开连接,否则会保持连接,程序不会退出
    winglight2016
    winglight2016
    May 29, 2019❤️1
    8
    使用了 promise 或者 async/wait 这种异步代码是有可能因为某个异常没有捕获,或者资源没有释放而阻塞,用 try/catch/final 处理一下吧。
    nondanee
    nondanee
    May 30, 2019 via Android❤️1
    9
    可能是还有 .on('xxx-event', () => {}) 事件监听没 end 吧
    jiejiss
    jiejiss
    May 30, 2019❤️1
    10
    如果还有 task 没有处理完就不会退出
    不过一般来讲都是 macrotask 的锅,因为 microtask 从注册到释放不会超过两个 time loop
    libook
    libook
    May 30, 2019❤️1
    11
    比如监听端口:
    const http = require('http');
    const server = http.createServer(console.log);
    server.listen(8080);
    console.log(`Server is running.`);

    又比如 Promise 预期会执行 resolve 或 reject,只不过暂时还没有执行的时候:
    new Promise((res, rej) => {
    setTimeout(res, 5000);
    })

    死循环也会出现进程一直没退出的现象。
    flyingfz
    flyingfz
    May 30, 2019❤️1
    12
    process.exit(0);
    nyse
    nyse
    OP
    May 31, 2019
    13
    问题找到了,确实是应为没断开 MySQL 连接造成的。

    感谢大家提供的思路。
    Lws
    Lws
    May 22, 2020
    14
    @winglight2016 确实如此,promise 造成了我的代理一直不退出。我这里的 promise 太多,写捕获还是有点麻烦的。看了下 node 有提供--unhandled-rejections=strict 在遇到未捕获时自动退出程序
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2629 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 15:07 · PVG 23:07 · LAX 07:07 · JFK 10:07
    ♥ Do have faith in what you're doing.