Node服务端开发

Node.js v8.x 中文文档: https://www.nodeapp.cn

2018.8.9

node支持import

### .1

因为目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require。这也是为什么在模块导出时使用module.exports,在引入模块时使用import仍然起效,因为本质上,import会被转码为require去执行。

### .2

检测ES6: npm install -g es-checker -> es-checker
添加ES6支持: npm install babel-cli -g (全局)
npm install babel-preset-es2015 –save
.babelrc文件:
{
“presets”: [
“es2015”
],
“plugins”: []
}
测试ES6: babel-node index.js 或者scripts: “babel”:”babel-node index.js”

### .3

Node.js默认使用的是CommonJS模块。在8.5.0版本后,Node.js支持了JavaScript Modules标准。但是需要添加参数–experimental-modules来开启。默认支持估计要到Node.js 10 LTS了。

同时为了区分使用CommonJS的代码和ES modules的代码,Node.js要求使用ES modules的代码使用.mjs作为后缀名。
详细信息可以参考:Using ES modules natively in Node.js

那有没有办法在Node.js 8.5.0前的版本中使用JavaScript Modules呢?有的,可以使用standard-things/esm: ES modules in Node today!项目。

保存图片

保存客户端/前端上传的图片
前端数据:FormData

1
2
3
4
5
6
7
const formData = new FormData();
const file = event.target.files[0]
const widgetId = this.state.widgetList[index]._id;
formData.append('file', file);
formData.append('widgetId', widgetId);

// fetch(url, {body: formData})

服务端(koajs)处理/接受数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const {
request: { body: { fields, files } },
} = ctx;
// console.log('fields', fields)

const { widgetId } = fields
const { file } = files
// console.log('file', file)
// console.log('file', file.path)

// 此时服务端接受的file.path 是一个服务端带串的路径
let uploadResult = await global.app.utils.uploader.uploadFileByPath(file.name, file.path, {
md5: false,
category: 'snapshot',
removeAfterUploaded: true
});

debug

在node_modules中找到webpack/bin/webpack.js文件顶部加入一行代码,便于调试,

#!/usr/bin/env node –inspect-brk
chrome://inspect在你需要的地方打上debugger;

事件循环

Node.js 事件循环,定时器和 process.nextTick()
六个状态:timers, pending callbacks ,idle, prepare ,poll(轮询) ,check , close callbacks
阶段概述

定时器:本阶段执行已经被 setTimeout() 和 setInterval() 的调度回调函数。
待定回调:执行延迟到下一个循环迭代的 I/O 回调。
idle, prepare:仅系统内部使用。
轮询:检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外),其余情况 node 将在适当的时候在此阻塞。
检测:setImmediate() 回调函数在这里执行。
关闭的回调函数:一些关闭的回调函数,如:socket.on(‘close’, …)。

与浏览器的区别。:v11.x 后基本一致了?

创建文件夹

创建文件的时候,如果目录不存在会报错。不会自动创建文件夹。
fs.mkdir不能一次创建多层目录,必须先创建上层目录,再创建下层目录.
所以需要(迭代)创建目录。比如路径:a/b/c/f.text
多次调用path.dirname将会逐层返回上级目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var fs = require("fs");
var path = require("path");

/**
* 递归创建目录 异步方法
*/
function mkdirs(dirname, callback{
fs.exists(dirname, function(exists{
if (exists) {
callback();
} else {
//console.log(path.dirname(dirname));
mkdirs(path.dirname(dirname), function({
fs.mkdir(dirname, callback);
});
}
});
}

/**
* 递归创建目录 同步方法
*/
function mkdirsSync(dirname) {
//console.log(dirname);
if (fs.existsSync(dirname)) {
return true;
} else {
if (mkdirsSync(path.dirname(dirname))) {
fs.mkdirSync(dirname);
return true;
}
}
}

knowledge is no pay,reward is kindness
0%