2016-02-16 33 views
1

當我試圖使用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

是不是因爲貓鼬使連接保持打開狀態?也許你應該'斷開'? – dgiugg

+0

你可以簡化第二個程序嗎?例如,如果'fs.readder','files.forEach'和/或'fs.readFile'是責任,那麼刪除'mongoose'引用。否則,如果'mongoose'是怪,你應該能夠刪除所有'fs'和'文件'東西。 – Sebivor

回答

0

可能是因爲你有一個貓鼬的連接,你沒有關閉。

讀完這些文件後,致電mongoose.disconnect()

節點是一個異步平臺,當解釋器到達代碼的末尾時,它必須做出是否關閉它的決定。它只能在事件循環被清除時安全地終止。

在完全同步的程序中,沒有任何工作會被添加到事件循環中,並且在處理完最後一個表達式之後終​​止將始終是安全的。你的第一個程序就是這種情況。

在您的第二個程序中,您撥打mongoose.connect會啓動一些異步工作,直到您明確呼叫mongoose.disconnect清除連接後纔會繼續運行。在此之前,解釋程序終止程序並不安全,因爲它不知道您是否已完成資源。

+0

我來自.net,爲什麼數據庫連接將停止節點終止程序,在.net程序將停止,即使我沒有關閉連接。 – Timeless

+0

擴展我的答案以幫助清除它。 –

0

您在評論中對.net進行了引用,Node.js在兩個具體的東西中有所不同。

  1. 這是設計是異步的。它預計即使您的代碼沒有運行,您仍然擁有聽衆,連接和類似的東西。這就是爲什麼節點如果它檢測到有未完成的偵聽器,它將永遠不會關閉該程序。

  2. 使用Node.js,您的代碼也充當服務器,而不是運行時。這意味着,在一個典型的.net,PHP等代碼中,你編寫的代碼是按照的要求執行,而運行時(比如IIS或者其他)將在那裏執行新的調用。所以你的代碼在沒有請求時會「退出」。

    用Node.js,寫服務器。你寫一個require('http').listen(8080, function() {...});所以你的代碼必須總是「活着」,在那裏等待請求。

那是在我外行人看來,爲什麼即使有某處掛鉤異步代碼一絲半點的Node.js代碼不退出程序的原因。