机构档案
  • 机构级别:普通会员
  • 信用等级:

在线交谈:点击这里给我发消息

咨询热线:029-62258374

学校评价(我要提问/点评)

  • 学校被点评:0
  • 好评(0%)
  • 中评(0%)
  • 差评(0%)

资料认证

    未通过身份证认证 未通过身份证认证

    未通过办学许可认证 未通过办学许可认证

  • 学校浏览人次:
  • 加盟时间:2017年03月10日
新闻动态

西安尚学堂Node.js中你需要知道的知识点

发布者:西安尚学堂 发布时间:2017-04-17 来源:西安尚学堂

Node.js是一个Javascript运行环境,实际上它是对Google V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。深圳尚学堂的小编给大家分享一些在Node.js中常用的一些知识点。

Node.js中你需要知道的知识点

querystring:可以用作通用解析器的模块

有时候我们会从数据库或其他地方得到这种奇怪格式的字符串:name:Sophie;shape:fox;condition:new,一般来说我们会利用字符串切割的方式来讲字符串划分到JavaScript Object。不过querystring也是个很好的现成工具:

  const weirdoString = `name:Sophie;shape:fox;condition:new`;
  const result = querystring.parse(weirdoString, `;`, `:`);
  // result:
  // {
  // name: `Sophie`,
  // shape: `fox`,
  // condition: `new`,
  // };

V8 Inspector

以--inspect参数运行你的Node应用程序,它会反馈你某个URL。将该URL复制到Chrome中并打开,你就可以使用Chrome DevTools来调试你的Node应用程序。

Server.listen 可以使用Object作为参数

命名参数的方式调用函数,相较于按照顺序的无命名参数法更直观。Server.listen也可以使用某个Object作为参数:

  require(`http`)
  .createServer()
  .listen({
  port: 8080,
  host: `localhost`,
  })
  .on(`request`, (req, res) => {
  res.end(`Hello World!`);
  });

不过这个特性不是表述在http.Server这个API中,而是在其父级net.Server的文档中。

相对地址

传入fs模块的距离可以是相对地址,即相对于process.cwd()。

  const fs = require(`fs`);
  const path = require(`path`);
  // why have I always done this...
  fs.readFile(path.join(__dirname, `myFile.txt`), (err, data) => {
  // do something
  });
  // when I could just do this?
  fs.readFile(`./path/to/myFile.txt`, (err, data) => {
  // do something
  });

使用setInterval执行定时任务

使用setInterval来定期执行数据库清理任务,不过默认情况下在存在setInterval的时候NodeJS并不会退出,你可以使用如下的方法让Node沉睡:

  const dailyCleanup = setInterval(() => {
  cleanup();
  }, 1000 * 60 * 60 * 24);
  dailyCleanup.unref();
  Use Signal Constants

如果你尝试在NodeJS中杀死某个进程,估计你用过如下语法:

 process.kill(process.pid, `SIGTERM`);

既然第二个参数可以同时使用字符串与整形变量,那么还不如使用全局变量呢:

process.kill(process.pid, os.constants.signals.SIGTERM);

IP Address Validation

NodeJS中含有内置的IP地址校验工具,这一点可以免去写额外的正则表达式:

  require(`net`).isIP(`10.0.0.1`) 返回 4
  require(`net`).isIP(`cats`) 返回 0

os.EOF

NodeJS内置了os.EOF,其在Windows下是rn,其他地方是n,使用os.EOL能够让你的代码在不同的操作系统上保证一致性:

  const fs = require(`fs`);
  // bad
  fs.readFile(`./myFile.txt`, `utf8`, (err, data) => {
  data.split(`\r\n`).forEach(line => {
  // do something
  });
  });
  // good
  const os = require(`os`);
  fs.readFile(`./myFile.txt`, `utf8`, (err, data) => {
  data.split(os.EOL).forEach(line => {
  // do something
  });
  });

HTTP 状态码

NodeJS帮我们内置了HTTP状态码及其描述,也就是http.STATUS_CODES,键为状态值,值为描述。你可以按照如下方法使用:

  someResponse.code === 301; // true
  require(`http`).STATUS_CODES[someResponse.code] === `Moved Permanently`; // true

避免异常崩溃

有时候碰到如下这种导致服务端崩溃的情况还是挺无奈的:

  const jsonData = getDataFromSomeApi(); // But oh no, bad data!
  const data = JSON.parse(jsonData); // Loud crashing noise.

为了避免这种情况,可以在全局加上了一个:

 process.on(`uncaughtException`, console.error);

当然,这种办法绝不是最佳实践,如果是在大型项目中需要使用PM2,然后将所有可能崩溃的代码加入到try...catch中。

Just this once()

除了on方法,once方法也适用于所有的EventEmitters,:

  server.once(`request`, (req, res) => res.end(`No more from me.`));

Custom Console

你可以使用new console.Console(standardOut,errorOut),然后设置自定义的输出流。你可以选择创建console将数据输出到文件或者Socket或者第三方中。

DNS lookup

Node并不会缓存DNS查询信息,因此在使用URL之后要等个几毫秒才能获取到数据。不过你可以使用dns.lookup()来缓存数据:

  dns.lookup(`www.myApi.com`, 4, (err, address) => {
  cacheThisForLater(address);
  });

fs 在不同OS上有一定差异

•fs.stats()返回的对象中的mode属性在Windows与其他操作系统中存在差异。

•fs.lchmod()仅在macOS中有效。

•仅在Windows中支持调用fs.symlink()时使用type参数。

•仅仅在macOS与Windows中调用fs.watch()时传入recursive选项。

•在Linux与Windows中fs.watch()的回调可以传入某个文件名

•使用fs.open()以及a+属性打开某个目录时仅仅在FreeBSD以及Windows上起作用,在macOS以及Linux上则存在问题。

在Linux下以追加模式打开某个文件时,传入到fs.write()的position参数会被忽略。

net 模块差不多比http快上两倍

关于net和http二者性能的讨论,可以通过运行两个服务器来进行比较。根据比较结果:http.Server大概每秒可以接入3400个请求,而net.Server可以接入大概5500个请求。

REPL tricks

•如果是在REPL模式下,就是直接输入node然后进入交互状态的模式。可以直接输入.load someFile.js然后可以载入包含自定义常量的文件。

•可以通过设置NODE_REPL_HISTORY=""来避免将日志写入到文件中。

•_用来记录最后一个计算值。

•在REPL启动之后,所有的模块都已经直接加载成功。可以使用os.arch()而不是require(os).arch()来使用。

以上就是在Node.js中需要知道的一些基本知识点,希望你在了解了这些知识点后更好的学习Node.js。