承诺防止节点进程退出

我写了一个使用Bluebird promise来迁移数据的工具,以便用户可以通过node命令直接触发这个工具。 例:

节点migrate.js

问题是,这个节点进程完成后不会存在。 这里是主migrate.js的内容,exec()函数返回一个promise。

var migrate = require('../elasticsearch/migrate'); var setting = require('../../config/setting'); var cmd = new migrate(setting.NewConfig.search, true); cmd.exec() .then(function () { console.info('Operation completed'); }) .catch(function (err) { console.error(err); }); 

目前,我强制退出通过调用process.exit(0);

migrate.js的内容,我无法公开的一些代码,所以我将它们删除

 'use strict'; var Promise = require('bluebird'); var request = Promise.promisifyAll(require('request')); var _ = require('lodash'); var index = require('./mapping.json'); var Schema = require('../../app/database/mysql/model'); var common = require('../../utils/common'); var client = require('../../utils/search'); var logger = require('../../utils/logger'); function Migrate(opts, enable) { this.buildInLogger = enable == undefined; this.opts = opts || {}; // Sensitive code // .... this.options = { url: this.opts.protocol + '://' + this.opts.host + '/' + this.opts.index, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } } } Migrate.prototype.initElasticsearch = function () { var self = this; var options = _.clone(this.options); return request.delAsync(options) .then(function () { options = _.clone(self.options); options.json = index; return request.putAsync(options); }) .then(function () { if (self.buildInLogger) { logger.info('Init new index successfully'); } else { console.log('Init new index successfully'); } }) .catch(function (err) { if (self.buildInLogger) { logger.error(err); } else { console.error(err); } }); }; Migrate.prototype.exec = function () { var self = this; return this.initElasticsearch() .then(function(){ // Sensitive code which also return a promise // .... }) .catch(function (err) { if (self.buildInLogger) { logger.error(err); } else { console.error(err); } }) }; module.exports = Migrate; 

因为这导致你的解决scheme,使我的意见成为一个答案。

在某处,node.js显然认为它有一个仍然打开的套接字,或者一个等待传入的请求仍在运行的服务器,或者一个定时器仍然会被触发。

请参阅node.js过程如何知道何时停止? 为更多的细节。