搭建服务框架
简介
基于Node.js语言,使用Koa2框架。
基础的js语法这里就不做介绍,反正也不难,看一下基础教程就行了,如果有编程基础,直接看代码也可以看懂的。
基础教程点击这里,廖老哥的入门教程还是很适合入门的。
node和npm的安装问题,这里就不特殊说明,自己可以去找找解决方案,推荐使用nvm来安装
关于npm
npm(node package manager),也就是node包管理工具,上面有很多小伙伴开发的开源组件,你可以使用npm来安装、共享、分发代码。链接在这里,我们服务端程序开发使用的开源代码也都是在这里找到的。
配置工程
进入到工程目录后,命令行输入 npm init
后会依次提示输入关于工程的相关信息:
name: (kite_server) 项目名称
version: (1.0.0) 版本号
description: 描述
entry point: (index.js) 程序入口
test command: 测试命令
git repository: git地址
keywords: 项目关键词
author: 作者
license: (ISC) 开源license
都输入完成后会在当前路径生成 package.json 文件,这个文件就是npm包管理的一个配置文件,后续自己做项目的时候可以这样生成,现在可以直接用我生成好的。
{
"name": "kite_server",
"version": "1.0.0",
"description": "个人云相册服务器",
"main": "index.js",
"scripts": {
"start": "node app.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/nervending/kite_server.git"
},
"dependencies": {
"koa": "2.7.0"
},
"author": "nervending",
"license": "Apache License 2.0",
"bugs": {
"url": "https://github.com/nervending/kite_server/issues"
},
"homepage": "https://github.com/nervending/kite_server#readme"
}
这里说明一下对默认生成package.json所做的修改
"scripts": {
"start": "node app.js"
},
这部分是配置脚本,比如里面的start命令表示,在命令行中 运行 npm run start 会执行 node app.js
"dependencies": {
"koa": "2.7.0"
},
这个表示当前工程对其他npm包的依赖,这里暂时就是依赖koa(就是我们用的网络框架),对应的版本是2.7.0,后续这里还会不断增加需要的东东。
然后在命令行执行
npm install
这个命令就会按照package.json的配置安装相关依赖,可以看到命令行一顿转圈圈,如果没有出错的话相关的依赖就会被安装到node_modules下。
这里说一下国内因为某些原因可能访问npm会有那么一点点小不顺利,这时候也可以使用cnpm,这个是淘宝做的npm镜像,访问速度快很多,有需要的点击这里,用法差不多。
run起来dongcidaci
还记得package.json里面添加的这一段么?
"scripts": {
"start": "node app.js"
},
现在就来实现app.js,工程目录下创建文件,输入内容(这就是koa的示例代码,稍后开始自己改)
const Koa = require('koa');
const app = new Koa();
// response
app.use(async (ctx, next) => {
await next();
ctx.body = 'Hello World';
});
app.listen(3000);
duang,现在就可以试试运行起来了,在命令行执行
npm start
然后在浏览器中访问 http://localhost:3000/ 就可以看到页面中显示
Hello World
这就是koa版Hello World,就是这么简单,我们的服务跑起来了。
简单说一下 app.use 每一次调用就是插入一个对请求处理的函数,通过调用await next();于是就可以实现逐层依次调用然后再依次返回出来的效果。有点抽象,看一个代码就知道了
const Koa = require('koa');
const app = new Koa();
// response
app.use(async (ctx, next) => {
console.log('f1 enter')
await next();
console.log('f1 out')
// ctx.body = 'Hello World';
});
app.use(async (ctx, next) => {
console.log('f2 enter')
await next();
console.log('f2 out')
ctx.body = 'Hello World';
});
app.listen(3000);
如果修改app.js这样的话,然后再访问http://localhost:3000/,你就可以在命令行中看到这样的输出
npm run start
> [email protected] start /Users/virl/wksp/kite/kite_server
> node app.js
f1 enter
f2 enter
f2 out
f1 out
现在这个样子懂了吧。
还需要说明一下,npm中npm start是npm run start的缩写,类似的还有npm test, npm stop等。
工程化的修改
这一次我们增加工程的配置文件,这是工程化开发中必须的一部分,比如开发环境、预发布环境、已经正式环境的不同服务器可能使用的都是不同的配置。这时候就要写不一样的配置文件。
在工程目录下创建configs目录,后续所有的配置文件都写在这个目录下。
在configs目录下创建index.js文件,用来封装对配置文件的读取
let env_name = process.env.NODE_ENV || 'development';
let config = undefined
try {
config = require(`./${env_name}`);
} catch (error) {
console.log(`\tFBI WARNING\nconfig file of '${env_name}' not found, exit process`)
process.exit(-1)
}
config.port = process.env.PORT || config.port module.exports = config
简单解释一下,process是node的全局变量,通过process.env 可以读取命令行中的参数
let env_name = process.env.NODE_ENV || 'development';
这一样的意思是如果没有配置NODE_ENV,则使用默认值'development'
config = require(`./${env}`);
这个的意思就是引用env_name字符串对应的名字的配置文件
config.port = process.env.PORT || config.port
这一行呢,就是如果在命令行参数指定了PORT字段则优先使用命令行中的,否则使用配置文件中的参数
现在执行 npm start就会报错,错误信息如下
virl@virldeMacBook-Pro-2 ~/w/k/kite_server>npm run start
> [email protected] start /Users/virl/wksp/kite/kite_server
> node app.js
FBI WARNING
config file of 'development' not found, exit process
这是因为还没有对应的配置文件,在configs目录下创建development.js文件
module.exports = {
port: 3000
}
然后修改app.js中最后两行
app.listen(Config.port);
console.log(`server start of:${Config.port}`)
在文件头添加对config的引用
const Config = require('./configs')
现在启动
npm run start
> [email protected] start /Users/virl/wksp/kite/kite_server
> node app.js
server start of:3000
可以试着执行这个命令看看输出是什么
env PORT=3301 npm run start
特殊说明
可以引用,不可转载,谢谢