为什么节点程序永远不会终止?

时间:2016-02-16 08:57:08

标签: javascript node.js

当我尝试使用node filename.js运行两个程序时,程序1将被终止,但程序2将不会停止。看来还有什么东西还在运行,我想念一下吗?我期待程序2在处理后停止。

计划1

function test(){
    console.log("test");
}

test();

计划2

var Kml = require('./kmlSchema');
var moment = require('moment');
var fs = require('fs');
var tj = require('togeojson');
// node doesn't have xml parsing or a dom. use jsdom
var jsdom =  require('jsdom').jsdom;
var mongoose = require('mongoose');
//var cronJob = require('cron').CronJob;

mongoose.connect('mongodb://xxx');

function readfiles(path){

    fs.readdir(path, function(err, files){

        if(err) throw err;

        files.forEach(function(file){

            fs.readFile(path+file,{encoding:'utf-8'},function(err,content){

            });
        });
    });
}

readfiles('./path/');

2 个答案:

答案 0 :(得分:0)

可能是因为你有一个尚未关闭的Mongoose连接。

阅读完这些文件后,请致电mongoose.disconnect()

Node是一个异步平台,当解释器到达代码末尾时,它必须决定是否关闭它。它只能在事件循环被清除后安全终止。

在完全同步的程序中,不会向事件循环添加任何工作,并且在处理完最后一个表达式后终止它将始终是安全的。第一个程序就是这种情况。

在第二个程序中,对mongoose.connect的调用会启动一些异步工作,这些工作将继续运行,直到您明确调用mongoose.disconnect来清理连接。在那之前,解释器终止程序是不安全的,因为它不知道你是否已经完成了资源。

答案 1 :(得分:0)

你在评论中引用了.net.Node.js在两个具体的东西中有所不同。

  1. 设计是异步的。它期望即使你的代码没有运行,你也可以连接监听器,连接和类似的东西。这就是为什么 node 运行时如果检测到有优秀的侦听器就永远不会关闭程序。

  2. 使用Node.js,您的代码也可以充当服务器,而不是运行时。这意味着,在典型的.net,PHP等代码中,您编写的代码是按每个请求执行,而运行时(例如,IIS或诸如此类)将同时存在,从而执行新的调用。所以你的代码在没有请求时“退出”。

    使用Node.js,编写服务器。你写了一个require('http').listen(8080, function() {...});所以你的代码必须总是“活着”,在那里等待请求。

  3. 在我的外行人看来,这就是为什么Node.js代码不会退出程序的原因,即使有一丝异步代码隐藏在某处。