【问题标题】:Running console commands through node inspector?通过节点检查器运行控制台命令?
【发布时间】:2013-08-01 05:56:16
【问题描述】:

我已将节点检查器连接到我正在运行的 node.js 程序。但我想通过控制台发出命令——不一定在断点上。例如,我的 server.js 程序中有全局变量和函数。例如:

var express = require('express');
var app = express();

function test() {
    console.log('yo');
}

app.listen(3000);

现在在节点检查器中,我进入控制台并输入“test()”,它返回“ReferenceError: test is not defined”,与全局变量相同,我输入“app”,它告诉我它没有定义.知道如何使这件事起作用吗?我只想运行我的节点程序,然后通过命令行界面向它发出命令。

【问题讨论】:

    标签: node.js node-inspector


    【解决方案1】:

    它不能按你预期工作的原因是你所有的变量和函数都是你的模块(应用程序)本地的,你不能从全局上下文中访问它们。

    如果您想从任何地方访问它们(包括未在断点处停止时从控制台),您可以将它们保存在全局范围内:

    var express = require('express');
    var app = express();
    
    function test() {
        console.log('yo');
    }
    
    app.listen(3000);
    
    global.test = test;
    

    【讨论】:

    • 节点不将它们保存在全局上下文中吗?像浏览器中的窗口对象一样?
    • 不,它们存储在闭包中。在节点检查器中查看源代码,您会看到您的代码被(function(...){ /* your code here */ }); 块包围。
    • 如果不将每个变量都放在全局变量中,我就无法通过命令行进入该闭包?
    • 当您在调试器中暂停时,控制台命令将在当前帧的上下文中运行,即您可以访问在您停止的函数中可见的闭包中的变量。但是当应用程序正在运行,控制台只能访问全局变量。
    【解决方案2】:

    @foreyez,

    您的问题启发了我制作一个 npm 模块,让您可以调试(通过命令行)正在运行的 node.js 应用程序,而无需设置断点或需要创建变量global

    https://github.com/go-oleg/debug-live

    希望有帮助!

    【讨论】:

    • 很棒的工具,谢谢。 console.log('yo'); 不输出字符串。也许你可以改进这一点。如果我按向上和向下键,它不会在命令历史记录中导航。语法高亮也很棒!
    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多