nodejs process.exit()阻止函数正常执行

时间:2015-08-07 21:47:29

标签: node.js

我正在编写我的第一个NodeJs脚本。下面是我为测试数据库连接而设置的一些代码。

当我在脚本的最后包含process.exit()时,没有任何内容记录到控制台 - 但是,当我只删除该行代码时,该函数会正确记录查询结果(也包括输出)。

我想知道为什么代码最后的process.exit()会阻止函数运行,如果我使用exit方法错误的话。

代码:

/*
 * Runs every minute on an uptime agent
 * Checks list of sites to see if they're up
 */

// strict mode (see http://stackoverflow.com/questions/8651415/what-is-strict-mode-and-how-is-it-used for information)
'use strict';

// cuz im lazy
String.prototype.lc = function() { return this.toLowerCase(); }
String.prototype.uc = function() { return this.toUpperCase(); }


/** EXCEPTIONS  **/
var DbConnectError = function(m) {
    this.name = 'DbConnectError';
    this.message = m;
}
var DbConfigError = function(m) {
    this.name = 'DbConfigError';
    this.message = m;
}

/**     DATABSE     **/
/*
 * change log
 * 08/07/2015   Tyler J Barnes
 *  -- init dev
 */
var db = function() {
    // error messages
    this._errors = [];

    // connection state
    this._isConnected = false;

    // db configuration
    this._config = {
        host: '',
        user: '',
        password: '',
        database: ''
    };

    // reference
    this._db = null;

    // connection obj ref
    this._con = null;

    // sql statement
    this._sqlStmt = '';

    // is prepared statement -- needs data binded
    this._isPrepared = false;

    // data to bind to prepared stmts
    this._sqlData = null;

    // query result set
    this._result = null;

    /*
     * initialize
     * @param (object) : cofig prop and values
     * @return void
     */
    this.ini = function(config) {
        // make sure config was passed
        if(!config || (typeof config).lc() != 'object') {
            throw new DbConnectError('Invalid DB Configuration');
        }
        // check for appropriate properties
        // if exist, store value
        for(var p in this._config) {
            if(!(p in config)) {
                this._errors.push('Missing database config: '+p+'\n');
            } else {
                this._config[p] = config[p];
            }
        }
        // throw any errors before continue
        if(this._errors.length > 0) {
            var tmp = '';
            for(var i = 0; i < this._errors.length; i++) {
                tmp+=this._errors[i];
            }
            throw new DbConfigError(tmp);
        }

        this._db = require('mysql');
    };

    // create connection -- returns thread id
    this.con = function() {
        this._con = this._db.createConnection(this._config);
        this._con.connect();
        this._isConnected = true;
    };

    // sets sql statement
    this.setSqlStmt = function(str, prepared, bindData) {
        this._sqlStmt = str;
        if(prepared) {
            this._isPrepared = true;
            this._sqlData = bindData;
        } else {
            this._isPrepared = false;
            this._sqlData = null;
        }
    };

    // kills connection
    this.die = function() {
        if(this._isConnected) {
            this._con.end();
        }
    };
}

var c = {
    host: 'asdfasdf',
    user: 'asdfasdf',
    password: 'asdfasdf',
    database: 'asdfasdf'
};
var d = new db();
d.ini(c);
d.con();
d._con.query('SELECT * FROM Agents', function(err,rows,fields) {
    if(err) console.log(err);
    console.log(rows);
});
d._con.end();

// this is what upsets me
process.exit();

删除process.exit()时的输出:

[{agentid:1, host: 'asdfasdfadf'....etc}]

1 个答案:

答案 0 :(得分:3)

数据库查询操作是异步的。这意味着它只会在程序执行完所有主模块后结束,包括Error using reshape Product of known dimensions, 14, not divisible into total number of elements, 52.系统调用。

相反,您应该只在从数据库获取结果时终止进程:

exit

这是JavaScript异步函数调用如何工作的典型误解之一。我建议你阅读这个主题。这两个问题可能有一些有用的内容: