nodejs作用
Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境,允许开发人员在浏览器之外编写命令行工具和服务器端脚本.
是javascript的一个运行环境,,,
nodejs stream
是前端工程化的基础
nodejs可以作为中间层,,因为只有前端才知道他需要哪些数据,,中小型项目不需要中间层
koa使用
koa:基于node.js的一个web框架
koa洋葱模型,,,koa的use()
: 表示使用中间件,,传入一个函数,每一个函数的参数有一个ctx:上下文环境,,next:下一个中间件,,,,一个中间件中执行下一个中间件,,,===》 洋葱模型,,如果存在异步调用,就会打破这种洋葱模型,,当前线程被阻碍,,,就会执行下面的内容,,,所以 必须使用 await 去等待next()
执行
const Koa = require("koa")const router = require()
// import Koa from "koa"console.log(Koa)class Sample{x=1
}
// 应用程序对象
var app = new Koa();function test(){console.log("hello")
}router.get("/classic/latest",(ctx,next)=>{ctx.body = {key:"classic"}
})app.use(router.routes())// 默认注册第一个中间件
// app.use(test)
/*** @ctx: 上下文* @next : 下一个中间件*/
// app.use(async (ctx, next) => {
// console.log("wtf")
// // 执行下一个中间件
// // 异步,,,
// // next的结果一定是一个promise
// let a = await next()
// console.log(a)
// console.log(2)
// })
//
// app.use(async (ctx,next)=>{
//
// // ctx是Requests别名
// console.log(ctx.path)
// console.log(ctx.method)
//
// if (ctx.path === "/aaa" && ctx.method ==='GET'){
// // koa最终会读取这个body,,将body内容返回
// ctx.body = "aaa"
// return "aaa"
// }
//
// })app.listen(3000)
koa-router使用
const Router = require("koa-router")
var router = new Router();
// get post put delete
router.get("/classic/latest",(ctx,next)=>{console.log(123)ctx.body={key:"classic"}
})
// 使用路由
app.use(router.routes())
所有路由写在一个页面不合适,需要被分类管理,,分到单独的js中,,但是怎么加载这个单独的路由,,
一个项目不是只有一个路由,,可以有很多个路由,,
挨个导入,并使用 这些路由,,
,,
但是路由也会有很多,怎么让他路由自动注册:
使用一个包require-directory
, 会读取指定路径下的所有包,,导出的包都去执行visit标识的函数
const requireDirectory = require("require-directory")
/*** 每加载一个module都去调用一下这个函数 whenLoadModule,, 并且将module传到whenLoadModule参数中* @type {{}}*/
const modules = requireDirectory(module,"./app/api",{visit:whenLoadModule})// o
function whenLoadModule(obj){// 约定路由模块只导出router。。。 如果带{} ,, 会导出多个,obj就是导出的多个if (obj instanceof Router){app.use(obj.routes())}
}
这个注册路由 写在了入口函数app.js
中,需要抽离出去
init.js
const requireDirectory = require("require-directory")
const Router = require("koa-router");class InitManager{static initCore(app){// 入口方法InitManager.app = appInitManager.initLoadRouters()}static initLoadRouters(){const apiDirectory = `${process.cwd()}/app/api`const modules = requireDirectory(module,apiDirectory,{visit:whenLoadModule})// ofunction whenLoadModule(obj){// 约定路由模块只导出router。。。 如果带{} ,, 会导出多个,obj就是导出的多个if (obj instanceof Router){InitManager.app.use(obj.routes())}}}
}module.exports = InitManager
在app.js中调用:
const InitManager = require("./core/init")
InitManager.initCore(app)
用到的api
- process.cwd() : 当前项目的根路径
CommonJS模块:
导入:
const aa = require("xxx")
导出:
module.exports="waterkid"
module.exports.eat = function (){console.log("eating")
}
module.exports={"username":"cc"
}