nodemon应用程序崩溃 - 等待文件更改后再启动

58

编辑 经过进一步测试,我发现在这个应用程序和mean.js的默认安装中,gulp和grunt都出现了这种情况。我正在Mac上本地运行。当我使用“node server.js”运行任何应用程序时,它们不会崩溃。

我使用grunt-nodemon的MEAN堆栈,并且当访问express URL时,node会崩溃。但是它并不总是一致的。有时它能正常工作,有时当URL被请求时就会导致node崩溃,而其他时候我会得到一个响应,但node立即崩溃。

浏览器控制台响应:

http://localhost:8000/api/users net::ERR_CONNECTION_REFUSED

终端输出:

Mongoose: users.insert({ firstname: 'mike', lastname: 'jones', email:'mike@gmail.com', role: 'admin', password: 'mike', _id: ObjectId("57485c16fc11894b96c28057"), created: new Date("Fri, 27 May 2016 14:39:18 GMT"), __v: 0 })   
user.save success
node crash
[nodemon] app crashed - waiting for file changes before starting...
在这种情况下,POST请求成功执行,用户被添加,之后节点崩溃,但有时在成功的POST之前就会崩溃。Node有时也会在GET请求时崩溃。 gruntfile.js:
module.exports = function(grunt) {
    // Load grunt tasks automatically
    require('load-grunt-tasks')(grunt);

    var pkg = grunt.file.readJSON('package.json');

    var options = {
        paths: {
            app: 'app',
            assets: 'app/assets',
            dist: 'app/dist',
            distAssets: 'app/dist/assets',
            html: 'app/html',
            htmlTmp: '.tmp/htmlsnapshot',
            htmlAssets: 'app/html/assets',
            index: 'app/dist/index.html',
            indexDev: 'app/index.html',
            indexTmp: '.tmp/html/index.html'
        },
        pkg: pkg,
        env: {
            test: {
                NODE_ENV: 'test'
            },
            dev: {
                NODE_ENV: 'development'
            },
            prod: {
                NODE_ENV: 'production'
            }
        }
    };

    // Load grunt configurations automatically
    var configs = require('load-grunt-configs')(grunt, options);

    // Define the configuration for all the tasks
    grunt.initConfig(configs);

    // Connect to the MongoDB instance and load the models
    grunt.task.registerTask('mongoose', 'Task that connects to the MongoDB instance and loads the application models.', function () {
        // Get the callback
        var done = this.async();

        // Use mongoose configuration
        var mongoose = require('./config/lib/mongoose.js');

        // Connect to database
        mongoose.connect(function (db) {
            done();
        });
    });

    grunt.registerTask('bumper', ['bump-only']);
    grunt.registerTask('css', ['sass']);
    grunt.registerTask('default', [
        'sass',
        'copy:dev',
        'nodemon',
        'concurrent:dev',
        'watch',
        'mongoose'
    ]);

    grunt.registerTask('shared', [
        'clean:demo',
        'copy:demo',
        'sass',
        'ngconstant',
        'useminPrepare',
        'concat:generated',
        'cssmin:generated',
        'uglify:generated',
        'filerev',
        'usemin',
        'imagemin',
        'usebanner'
    ]);

    grunt.registerTask('demo', [
        'shared',
        'copy:postusemin',
        'grep:demo'
    ]);

    grunt.registerTask('dist', [
        'shared',
        'copy:postusemin',
        'copy:dist',
        'grep:dist',
        'compress',
        'copy:postusemin',
        'grep:demo',
    ]);

    grunt.loadNpmTasks('grunt-forever');

};

default.js

module.exports.tasks = {
    // version update
    bump: {
        options: {
            files: ['package.json', 'bower.json'],
            pushTo: 'origin'
        }
    },

    // application constants
    ngconstant: {
        options: {
            dest: '<%= paths.assets %>/js/app.constants.js',
            name: 'app.constants',
        }
    },

    // remove all bs from css
    cssmin: {
        options: {
            keepSpecialComments: 0
        }
    },
    markdown: {
        all: {
            files: [
                {
                    src: 'README.md',
                    dest: '<%= paths.assets %>/tpl/documentation.html'
                }
            ],
            options: {
                template: '<%= paths.assets %>/tpl/_documentation_template.html',
            }
        }
    }
};

dev.js:

var _ = require('lodash'),
defaultAssets = require('./assets/default'),
testAssets = require('./assets/test'),
testConfig = require('./env/test'),
fs = require('fs'),
path = require('path');

module.exports.tasks = {
    // copy files to correct folders
    copy: {
        dev: {
            files: [
                { expand: true, src: '**', cwd: '<%= paths.app %>/bower_components/font-awesome/fonts',                    dest: '<%= paths.assets %>/fonts' },
                { expand: true, src: '**', cwd: '<%= paths.app %>/bower_components/material-design-iconic-font/fonts',     dest: '<%= paths.assets %>/fonts' },
                { expand: true, src: '**', cwd: '<%= paths.app %>/bower_components/roboto-fontface/fonts',                 dest: '<%= paths.assets %>/fonts' },
                { expand: true, src: '**', cwd: '<%= paths.app %>/bower_components/weather-icons/font',                    dest: '<%= paths.assets %>/fonts' },
                { expand: true, src: '**', cwd: '<%= paths.app %>/bower_components/bootstrap-sass/assets/fonts/bootstrap', dest: '<%= paths.assets %>/fonts' }
            ]
        }
    },

    // watch for changes during development
    watch: {
        js: {
            files: ['Gruntfile.js', '<%= paths.assets %>/js/**/*.js'],
            tasks: ['jshint'],
            options: {
                livereload: true
            }
        },
        css: {
            files: [
                '<%= paths.assets %>/css/**/*.scss'
            ],
            tasks: ['sass'],
            options: {
                livereload: true
            }
        },
        markdown: {
            files: [
                'README.md'
            ],
            tasks: ['markdown']
        },
        tasks:  [ 'express:dev' ],
    },

    // debug while developing
    jshint: {
        all: ['Gruntfile.js', '<%= paths.assets %>/js/**/*.js']
    },
    concurrent: {
        dev: {
            tasks: ['nodemon', 'node-inspector', 'watch'],
            options: {
                logConcurrentOutput: true
            }
        }
    },
    nodemon: {
        dev: {
            script: 'server.js',
            options: {
                nodeArgs: ['--debug'],
                ext: 'js,html',
                callback: function (nodemon) {

                    nodemon.on('crash', function (event) {
                        console.log(event);
                    });


                },
                watch: _.union(defaultAssets.server.gruntConfig, defaultAssets.server.views, defaultAssets.server.allJS, defaultAssets.server.config)
            }
        }
    },
    forever: {
        server1: {
            options: {
                index: 'server.js',
                //logDir: 'logs'
            }
        }
    }
};

Angular 控制器函数:

  $scope.addUser = function(){

      var user = {
          firstname: $scope.firstname,
          lastname: $scope.lastname,
          email: $scope.email,
          role: $scope.role.selected,
          password: $scope.password
      };

      $http.post('/api/userAdd', user ).then(function successCallback(response) {
          $location.path('/users');
      }, function errorCallback(response) {
          console.log('error addding user');
          console.log(response);
      });
  };

Express路由:

User = require('../models/user.js');

module.exports = function (app) {

    app.get('/api/users', function (req, res) {

        User.find({}, function (err, users) {
            if ( err ) {
                res.send({
                    message : 'error finding users',
                    success: false
                });
            } else {
                res.json(users);
            }
        });

    });

    app.get('/api/users', function (req, res) {
        User.find({fields: {}}, function (err, docs) {
            res.json(docs);
        });
    });

    app.post('/api/userAdd', function (req, res) {

        var user = new User(req.body);

        user.save( function( err, user ){

            if (err){
                console.log('user.save error');
                console.log(err);
                res.send({
                    success: false
                });
            } else {
                console.log('user.save success');
                res.send({
                    success: true
                });
            }
        });

    });

};

我也在使用Chrome的高级REST扩展进行测试,但是使用此工具进行任何请求时,节点立即崩溃。

我对MEAN还很陌生,这里是否有什么导致崩溃的问题?有什么想法吗?


尝试手动运行服务器,看看在崩溃之前是否会打印任何错误:node server.js - robertklep
手动运行似乎解决了问题,谢谢。这是否意味着我在Grunt方面存在某些问题或配置错误? - MTD
不是真的。我假设通过独立运行它,你会看到它为什么崩溃。它本来就不应该更好地工作;D - robertklep
已添加了正在使用且导致错误的完整gruntfile.js、default.js和dev.js。希望这些能有所帮助。 - MTD
现在使用 node --debug server.js 进行测试时,我得到了错误信息 Segmentation fault: 11 并且 node 崩溃了。但是如果我不使用 --debug,就没有崩溃和错误信息。 - MTD
33个回答

94

这是因为后台运行了许多服务器进程,所以你只需要在终端停止它们即可。

快速技巧


对于Linux系统

通过在终端上运行以下命令来终止它们:

pkill -f node

然后重新启动nodemon。


针对Windows操作系统

 1. Go to the task manager
 2. Then look for Node.js: Server-side JavaScript
 3. Then right click on it and End task from the processes. 

然后重新启动服务器。它将正常工作。


1
在Windows上该怎么做? - prograshid
2
对于Linux系统:这个方法对我没有起作用。我还需要使用px aux | grep node命令来查找进程,并使用kill -9 [PROCCESS_ID]命令终止它们。 - Oscar Chambers
"pkill -f node" 不起作用。下面的答案是有效的:killall -9 node。 - Liker777
2
我在Windows任务管理器中没有看到“Node.js:服务器端JavaScript”。 - Waleed Ahmad
在Windows中,打开PowerShell,执行"taskkill /im node.exe /f"命令。谢谢你给我杀死Node进程的提示。 - Agung Sagita

17
对于Windows用户,打开任务管理器并找到“node.js服务器端JavaScript”进程,终止该进程。然后再次使用您的命令尝试。

1
我尝试使用各种命令在终端中关闭正在运行的服务器...没有一个起作用,但这个简单的技巧却做到了。感谢@Jamim Uddin。 - Ashique Desai

11
在终端中使用以下命令杀死正在运行的端口并重新启动您的服务。
killall -9 node

或者只关闭特定端口而不是全部关闭。

sudo lsof -i :3000 //replace 3000 with your port number
sudo kill -9 31363 // replace 31363 with your PID

1
可以,谢谢!与上面答案中的“pkill -f node”不同。 - Liker777
你如何找到PID?我也在使用Linux。 - Shane G
@ShaneG sudo lsof -i :3000(这里的3000是您正在运行的应用程序的端口) 这将返回以下类型的响应 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php 1159083 SIVA 11u IPv4 8207821 0t0 TCP localhost:3000 (LISTEN)在这里,您可以看到第二列的PID,这里我的端口3000的PID为1159083。 - Siva

8
有时候会出现忘记源化 .env 文件的情况。

谢谢!我相信你让我免去了数小时的额外烦恼。 - Chunky Chunk

7

问题: 应用程序崩溃 - 在启动之前等待文件更改...

可能有不同的原因:

1. 在后台运行node

pkill -f node

在Mac OS上有效,在Microsoft上无效。

2.server.js和package.json不在同一个文件夹中。请检查一下。

检查package.json。

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
     "start": "nodemon Server.js"
 }

3

我将Node从v4.2.6升级到了v4.4.5,解决了默认的mean.js安装问题。从此开始构建。


我建议你切换到最新的Node LTS版本:8.9.3。或者至少是最新的LTS Node 4.x:4.8.7。使用nvm(https://github.com/creationix/nvm)非常容易实现。 - MathKimRobin

2

我已经有一个多月没有使用MongoDB了。因此,MongoDB云(Atlas)自动暂停了MongoDB集群。我恢复了集群,并重新启动了应用程序(同时重新检查了保存在default.json中的mongo连接URL)。

这就是我的做法。


2
很可能您的节点守护程序仍在运行。
使用以下命令检查:ps -eaf | grep node 如果输出如下所示: abhinav 15759 15748 0 19:30 pts/2 00:00:00 sh -c nodemon server.js abhinav 15760 15759 0 19:30 pts/2 00:00:00 node /home/abhinav/Documents/Projects/WebD/Node/smartbrain/smart-brain-api/node_modules/.bin/nodemon server.js abhinav 15812 15801 0 19:31 pts/2 00:00:00 sh -c nodemon server.js 那么,请尝试以下命令:killall node

1

这实际上可能是因为一个错误破坏了你的项目。仔细阅读语法错误并更好地理解出现错误的位置。


似乎你的回答被截断了。 - Geshode

0

如果您的 PORT 被先前的节点进程(任务)使用了

运行命令 netstat -a -n -o | find "8080" cmd1

并使用以下命令传递已打开的任务

taskkill /F /PID "1544"

cmd2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接