【问题标题】:Promise prevent node process from exitingPromise 防止节点进程退出
【发布时间】:2015-08-03 23:13:46
【问题描述】:

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

节点迁移.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;

【问题讨论】:

  • new migrate() 调用是否创建了需要关闭的子进程?
  • 我用 ps -u 检查进程列表,发现只有一个节点进程在运行:kiettv 20832 4.9 1.0 1007264 79596 pts/9 Sl+ 11:08 0:01节点迁移.js
  • new migrate() 是做什么的?您可以添加对该库的引用吗?
  • 我用 migrate.js 的内容更新帖子
  • 某处,node.js 显然认为它有一个仍然打开的套接字,或者一个等待传入请求的服务器仍在运行,或者一个计时器仍在触发。请参阅stackoverflow.com/questions/7698834/… 了解更多信息。

标签: node.js promise bluebird


【解决方案1】:

将我的评论变成答案,因为这会引导您找到解决方案。

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

更多详情请参阅How does a node.js process know when to stop?

【讨论】:

  • 在我的情况下,有一个 mysql 套接字仍然打开。很好的答案。
猜你喜欢
  • 2010-10-09
  • 2018-11-10
  • 2012-03-07
  • 2017-10-23
  • 1970-01-01
  • 2011-02-12
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多