node.js退出程序,nodejs结束运行

发布时间:2022-11-25

本文目录一览:

1、windows下node.js出错退出了怎么解决
2、如何退出用node.js执行的脚本
3、nodejs终端命令行模式怎么退出
4、node.js怎么监听程序强制退出
5、node执行js代码怎么退出当前代码
6、[node.js 基础操作](#node.js 基础操作)

windows下node.js出错退出了怎么解决

随着近日Paypal和Netflix宣告迁移到Node.js,服务器端Javascript平台已经证明其自身在企业领域的价值。这对于Node来说是一小步,对于Javascript而言却是一大跨越啊! 来自.NET, Java, PHP, Ruby on Rails和更多技术领域的程序员,所有游走于服务器端的编码者都会聚集到这个平台上。作为像 Yahoo, Walmart, 和 Oracle 这样的大玩家入局,Node 正在甩掉其一直就存在的不成熟和不稳定的坏名声。 在这篇文章中,我会向你展示在Window环境下安装Node.js到底有多容易。安装Node.js让Node.js安装在Windows上就是小事一桩。到 Node.js 网站下载并运行".msi"文件。它将会把Node.js 和 NPM (Node包管理模块)安装上。NPM 相当于用于.NET应用的 NuGet 包管理器。 运行Node.js在Windows上运行Node.js同样很容易。打开 PowerShell 并输入 "node -v" 确保Node在你的环境变量,并查看你正在运行的Node.js的版本。同样的输入 "npm -v" 来查看你安装的Node包管理工具的版本。你弄好了没?Ok, 让我们来开始享受乐趣吧!! 打开记事本程序,我们将构建我们的第一个Node.js应用。把下面的代码复制到记事本程序中,使用任何文件名都可以,比如"example.js",并把它保存到你希望的文件夹中:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Node');
}).listen(1337, '127.0.0.1');

现在回到 PowerShell。将路径变更到你的"example.js"文件存放的地方,并运行Node!

cd C:\Websites\NodeTest
node example.js

开启你的网页浏览器,导航输入 127.0.0.1:1337。起作用了么?恭喜你运行了你的第一个Node.js应用!

提供网站服务

你会担忧我会只留下一个 "Hello World" 示例就收工了?如果我们知道如何去运行一个HTML文件,那将会更加的美好。添加一个 "index.html" 文件,里面可以是任何HTML内容。将会像这样:

<html>
<head>
  <title>Sample Node.js Website</title>
</head>
<body>
  <p>This is the home page for you Node.js website.</p>
</body>
</html>

是时候运行应用了。创建一个可以叫任何名字的新文件,比如 "index.js",并把如下的js代码加到里面:

var http = require('http');
var fs = require('fs');
http.createServer(function(req, res){
  fs.readFile('index.html', function (err, data){
    res.writeHead(200, {
      'Content-Type': 'text/html',
      'Content-Length': data.length
    });
    res.write(data);
    res.end();
  });
}).listen(1337, '127.0.0.1');

事情在这里开始变得更加有趣了。注意开头的地方多了一行 "require"。你正在往你的应用中带入需要的依赖程序。这像是C#中用来调用依赖程序的 "using" 命名空间指令。 通过在PowerShell中输入:

node index.js

来运行"index.js"(不要忘了敲击 Ctrl-C来退出上一个Node应用的运行,或者在这一次使用一个新的端口号)。在你的浏览器中,导航到127.0.0.1:1337,你就应该会看到你的HTML文件了。 你将可能在这点成就上感到有些激动,但如果你想我,就会对它产生一些复杂的感觉。这还只是低级别的编程,如果我不得不去考虑读取/流媒体文件,还有有关每次应该发送什么状态这些问题的时候,世界很快就会变得烦恼重重。向 ExpressJS道好吧!

使用Node包管理器

Node.js有一个再次让我们感觉世界美好的搭档。ExpressJS 屏蔽掉了需要在Node.js进行的老调重弹,让你可以直接进入web开发。它是一个可以让你构建单页,多页还有混合类型web应用程序的web框架。没有它你在 Node.js 领域是不会有盼头滴! 首先使用 NPM 来安装它。为此,再一次打开PowerShell并切换到你的应用程序的路径。现在输入:

npm install express

它将会创建一个叫做 "node_modules" 来安装 ExpressJS。从这个角度上看,你的Node模块将会放到那里,有点像在.NET应用中的"bin"目录,从这里你可以调用或者"require"你的依赖程序。

ExpressJS入门

现在任意创建一个新文件,比如 "server.js",并把下面的代码粘贴进去:

var express = require('express'); //CREATE APP
var app = express();
//LOCATION OF STATIC CONTENT IN YOUR FILESYSTEM
app.use(express.static(__dirname));
//PORT TO LISTEN TO
app.listen(1337);

这是在调用ExpressJS的依赖,然后从它那里创建一个应用。从此你可就牛逼大发了! 在这里,我们只是简单的提供静态文件服务。__dirname 是来自ExpressJS的一个特殊的变量,意思是根文件系统位置。最后你告诉应用去侦听端口 1337。 现在你就拥有了一个提供静态文件服务的 Node.js 站点了! 另外在新增一些HTML文件,一些放在子目录中,然后到127.0.0.1:1337 测试看看吧。

关于 IIS

在这些示例中,我一直都是在端口1337运行应用,而不是端口80。原因是IIS已经侦听了80端口。有许多的方法可以使IIS 和 Node.js 和谐共存:

  • IISNode: 这是一个在你的IIS站点让Node.js像一个应用池那样运行的很聪明的点子,同在IIS中与运行PHP很像。事实上,Azure就是用这个在其平台上运行Node.js的。
  • WinServ: 它让 Node.js 像一个Windows服务那样运行。它实际上是对流行了 NSSM (Non-Sucking Service Manager) 的一个对Node.js友好的封装。一旦作为一个服务运行,你就可以使用IIS的应用请求路由(ARR) 来代理向你的Node.js应用端口发起的请求。

关于 MS SQL

有许多为Node.js准备的 MS SQL 驱动程序,有些甚至是跨平台的。有一个只能在Windows环境中运行的,是由Windows Azure发布: Microsoft Driver for Node.js for SQL Server。而你可以像下面这样开始工作:

var sql = require('node-sqlserver');
var connStr = "Driver={SQL Server Native Client 11.0};Server=(local);Database=AdventureWorks2012;Trusted_Connection={Yes}";
var cmd = "SELECT TOP 10 FirstName, LastName FROM Person.Person";
sql.open(connStr, function (err, conn) {
  conn.queryRaw(cmd , function (err, results) {
    for (var i = 0; i < results.rows.length; i++) {
      console.log("FirstName: " + results.rows[i][0] + " LastName: " + results.rows[i][1]);
    }
  });
});

总结

这些都只是皮毛! 与 ExpressJS携手,你将能够创建带有路由、视图、布局、服务还有更多组件的完全成熟的MVC应用程序。同样,除非你需要去集成一些现有的Microsoft应用程序或者MS SQL数据库,MongoDB 在你创建一个Node堆栈式是能帮助你从SQL中解放的好伙伴。最后,你可以使用MEAN创建一个MEAN Javascript全栈应用,包括有MongoDB, ExpressJS, AngularJS, 和Node.js。 现在企业已经向Node.js靠拢了,对你而言同样是不是时候来辅助行动了呢?

如何退出用node.js执行的脚本

  1. 直接运行run.bat文件 下面的内容为批处理文件run.bat中的内容,批处理命令中NODE_PATH为Node.js的安装路径。使用express生成的项目。app.js为待测试的Node.js 文件。
@set NODE_PATH=D:\nodejs\demo\npm
@echo %PATH% | find "Node.js"
@if %errorlevel% == 1 set PATH=%PATH%;%NODE_PATH%
@rem @echo %cd%
@node app.js
  1. 通过参数运行run.bat文件 批处理文件仅起到设置环境变量的作用,在Node.js项目的目录下运行。批处理文件命令为:
@set NODE_PATH=D:\nodejs\demo\npm
@echo %PATH% | find "Node.js"
@if %errorlevel% == 1 set PATH=%PATH%;%NODE_PATH%
@rem @echo %cd%
@node %1

例如:

D:\nodejs\demo\node app.js

nodejs终端命令行模式怎么退出

退出node命令行:两次 Ctrl+C 或者一次 Ctrl+D 退出终端:exit; (经测试,都没什么问题)

node.js怎么监听程序强制退出

nodejs中可以通过监听信号量来监听程序的退出。 例如 SIGINT 监听 Ctrl+D/Control+C 退出程序:

process.on('SIGINT', function() {
  console.log('Got SIGINT. Press Control-D/Control-C to exit.');
});

node执行js代码怎么退出当前代码

你输入js代码并按下回车后,node会输出执行完该代码后的返回值,如果没有返回值,肯定就显示 undefined 了,这个跟Chrome的调试工具相似; 执行 process.exit() 退出;

node.js 基础操作

require 函数用来在一个模块中引入另外一个模块。传入一个模块名,返回一个模块导出对象。用法:let cc = require("模块名"),其中模块名可以用绝对路径也可以用相对路径,模块的后缀名 .js 可以省略。例如:

let cc = require("./module");

require()函数的两个作用:

  1. 引入模块
  2. 加载第三方包 exports 对象用来导出当前模块的公共方法或属性,别的模块通过 require 函数使用当前模块时得到的就是当前模块的 exports 对象。用法:exports.name,name为导出的对象名。例如:
exports.sayHello = function() {
  console.log("Hello");
};

module.exports 用来导出一个默认对象,没有指定对象名,常见于修改模块的原始导出对象。比如原本模块导出的是一个对象,我们可以通过 module.exports 修改为导出一个函数。如下:

module.exports = function() {
  console.log("This is a function");
};

3. 加载第三方包

Node.js中使用 CommonJs 模块化机制,通过 npm 下载的第三方包,我们在项目中引入第三方包都是:

let xx = require('第三方包名');

究竟 require 方法加载第三方包的原理机制是什么,今天我们来探讨下。 require('第三方包名') 优先在加载该包的模块的同级目录 node_modules 中查找第三方包。 找到该第三方包中的 package.json 文件,并且找到里面的 main 属性对应的入口模块,该入口模块即为加载的第三方模块。 如果在要加载的第三方包中没有找到 package.json 文件或者是 package.json 文件中没有 main 属性,则默认加载第三方包中的 index.js 文件。 如果在加载第三方模块的文件的同级目录没有找到 node_modules 文件夹,或者以上所有情况都没有找到,则会向上一级父级目录下查找 node_modules 文件夹,查找规则如上一致。 如果一直找到该模块的磁盘根路径都没有找到,则会报错:can not find module xxx

4. npm命令

npm 英文全称:node package manager,npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个包(package)(即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。我们平时开发项目都是需要使用npm下载依赖,常见的npm命令总结如下:

  • npm init:初始化项目
  • npm install:安装依赖
  • npm install <package>:安装指定包
  • npm install -g <package>:全局安装
  • npm uninstall <package>:卸载包
  • npm update <package>:更新包
  • npm list:列出已安装的包

5. 文件读取

var fs = require('fs');

同步:

var content = fs.readFileSync('hello.txt',{flag:'r',encoding:"utf-8"});

异步(默认):

fs.readFile('hello.txt', 'utf8', function(err, data) {
  if (err) throw err;
  console.log(data);
});

flag:读取模式
encoding:编码格式

7. 文件写入

var fs = require('fs');

格式:write=wread=rappend=a 异步:

fs.writeFile('hello.txt', 'Hello World', { flag: 'w' }, function(err) {
  if (err) throw err;
  console.log('写入成功');
});

8. 文件删除

fs.unlink('lc.txt', function() {
  console.log('文件已删除');
});

9. Buffer缓冲区

数组不能进行二进制数据的操作;JS数组不像Java、Python等语言效率高;Buffer内存空间开辟出固定大小的内存。

let buf1 = Buffer.alloc(10);
console.log(buf1);

allocUnsafe(效率高):

let buf2 = Buffer.allocUnsafe(10);
console.log(buf2);

10. 文件目录

var fs = require('fs');
fs.readdir(path, callback);

导入 readline 包:

let readline = require('readline');

实例化接口对象(process对象,stdout/in输入输出):

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

question方法提问:

rl.question('请输入内容:', (answer) => {
  console.log(`你输入了:${answer}`);
  rl.close();
});

close 事件监听:

rl.on('close', () => {
  console.log('程序结束');
});

11. 文件流

var fs = require('fs');

语法:

fs.createWriteStream(文件路径, [可选的配置操作])
let ws = fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
let rs = fs.createReadStream('hello.txt',{flags:'r',encoding:"utf-8"});

音乐:

let rs = fs.createReadStream('snake.mp4',{flags:'r'});

读取时写入:

let ws = fs.createWriteStream('a.txt',{flags:"w",encoding:"utf-8"});
createReadStream.pipe(createWriteStream);

链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。 接下来我们就是用管道和链式来压缩和解压文件。 创建 compress.js 文件,代码如下:

const fs = require('fs');
const zlib = require('zlib');
const gzip = zlib.createGzip();
const inputStream = fs.createReadStream('input.txt');
const outputStream = fs.createWriteStream('input.txt.gz');
inputStream.pipe(gzip).pipe(outputStream);

执行完以上操作后,我们可以看到当前目录下生成了 input.txt 的压缩文件 input.txt.gz。 接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:

const fs = require('fs');
const zlib = require('zlib');
const gunzip = zlib.createGunzip();
const inputStream = fs.createReadStream('input.txt.gz');
const outputStream = fs.createWriteStream('output.txt');
inputStream.pipe(gunzip).pipe(outputStream);

12. Node事件

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个 while(true) 的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。 没有使用 events 包,仅使用JavaScript事件监听进行事件驱动。 Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。 当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。 这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO) 在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。 Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('事件触发');
});
myEmitter.emit('event');

以下程序绑定事件处理程序:

myEmitter.on('event', (a, b) => {
  console.log(a, b, this);
});

我们可以通过程序触发事件:

myEmitter.emit('event', 'a', 'b');

接下来让我们执行以上代码: 在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数,回调函数接收错误对象作为第一个参数。 接下来让我们来重新看下前面的实例,创建一个 input.txt,文件内容如下:

Hello Node.js

创建 main.js 文件,代码如下:

const fs = require('fs');
fs.readFile('input.txt', function(err, data) {
  if (err) return console.error(err);
  console.log(data.toString());
});

以上程序中 fs.readFile() 是异步函数用于读取文件。如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。 如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。 执行以上代码,执行结果如下:

Hello Node.js

接下来我们删除 input.txt 文件,执行结果如下所示:

Error: ENOENT: no such file or directory, open 'input.txt'

因为文件 input.txt 不存在,所以输出了错误信息。 Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。 Node.js里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件,一个 fs.readStream 对象会在文件被打开的时候触发一个事件。所有这些产生事件的对象都是 events.EventEmitter 的实例。 events 模块只提供了一个对象:events.EventEmitterEventEmitter 的核心就是事件触发与事件监听器功能的封装。 你可以通过 require("events"); 来访问该模块。 EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。 下面我们用一个简单的例子说明 EventEmitter 的用法:

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('some_event 事件触发');
});
setTimeout(() => {
  myEmitter.emit('event');
}, 1000);

执行结果如下:

some_event 事件触发

运行这段代码,1 秒后控制台输出了 'some_event 事件触发'。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用 some_event 的监听器。 EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持若干个事件监听器。 当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。 让我们以下面的例子解释这个过程:

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('someEvent', () => {
  console.log('监听器1');
});
myEmitter.on('someEvent', () => {
  console.log('监听器2');
});
myEmitter.emit('someEvent');

执行以上代码,运行的结果如下:

监听器1
监听器2

以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后触发了 someEvent 事件。 运行结果中可以看到两个事件监听器回调函数被先后调用。这就是 EventEmitter 最简单的用法。 EventEmitter 提供了多个属性,如 onemiton 函数用于绑定事件函数,emit 属性用于触发一个事件。接下来我们来具体看下 EventEmitter 的属性介绍。