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 = app
InitManager.initLoadRouters()
}
static initLoadRouters(){
const apiDirectory = `${process.cwd()}/app/api`
const modules = requireDirectory(module,apiDirectory,{visit:whenLoadModule})
// o
function 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"
}